От: | nen777w | ||
Дата: | 28.08.18 10:52 | ||
Оценка: |
//собственно конфигурация
enum ECallbackType
{
SYNC,
ASYNC,
};
//пустышка
template<ECallbackType cbt, typename... Args>
class callback_impl;
//реализация
template<ECallbackType cbt, typename R, typename... Args>
class callback_impl<cbt, R(Args...)>
{ /*todo*/ };
//................................................................
template <ECallbackType cb>
using callback_emit_type = std::integral_constant<ECallbackType, cb>;
template <typename T>
struct is_callback_emit_type
: std::false_type
{};
template <ECallbackType cb>
struct is_callback_emit_type<callback_emit_type<cb>>
: std::true_type
{};
//................................................................
template <typename T>
using is_callback_type_t = typename is_callback_emit_type<T>::type;
//................................................................
//импл. для дефолтного (синхронного) объявления типа: callback<void()>
template <typename _unused, typename... Args>
struct construct_callback_impl
{
using type = callback_impl<SYNC, Args...>;
};
//импл. для конфигурируемого объявления типа: callback<callback_emit_type<ASYNC>, void()>
template <typename ECallbackType, typename... Args>
struct construct_callback_impl<typename std::enable_if<is_callback_type_t<ECallbackType>::value>::type, ECallbackType, Args...>
{
using type = callback_impl<ECallbackType::value, Args...>;
};
//................................................................
//собственно алиас на тип
template <typename... Args>
using callback = typename construct_callback_impl<Args...>::type;
callback<int(int)> ff_s; //<-- uses undefined class 'callback_impl<SYNC>' - callback<int(int), int(int)> ff_s спасает положение, но выглядит криво
callback<callback_emit_type<ASYNC>, int(int)> ff_a;
template <typename... Args>
struct construct_callback_impl
{
using type = int; //временная заглушка
};
template <typename... Args>
struct construct_callback_impl<typename std::enable_if<is_callback_type_t< std::tuple_element_t<0, std::tuple<Args...> >::type >::value>::type, Args...>
{
using type = int; //временная заглушка
};
'is_callback_type_t': 'std::tuple_element_t<0,std::tuple<_Types...>>::type' is not a valid template type argument for parameter 'T'
От: | vopl | ||
Дата: | 28.08.18 14:37 | ||
Оценка: |
N>template <typename... Args>
N>struct construct_callback_impl
N>{
N> using type = int; //временная заглушка
N>};
N>template <typename... Args>
N>struct construct_callback_impl<typename std::enable_if<is_callback_type_t< std::tuple_element_t<0, std::tuple<Args...> >::type >::value>::type, Args...>
N>{
N> using type = int; //временная заглушка
N>};
N>
'is_callback_type_t': 'std::tuple_element_t<0,std::tuple<_Types...>>::type' is not a valid template type argument for parameter 'T'