Пытаюсь сочинить конфигурируемый функтор...
От: 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;


Но что то не получается никак...
У меня вообще уже сомнения закрались, можно ли такое сделать?

Вот есть std::async() который я собираюсь использовать в реализации асинхронного вызова, но конфигурация его поведения происходит в рантайме...

Пробовал убрать EEmitType и доставать его из Args...

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'

Отредактировано 28.08.2018 12:19 nen777w . Предыдущая версия . Еще …
Отредактировано 28.08.2018 12:08 nen777w . Предыдущая версия .
Отредактировано 28.08.2018 11:32 nen777w . Предыдущая версия .
Отредактировано 28.08.2018 11:29 nen777w . Предыдущая версия .
Re: Пытаюсь сочинить конфигурируемый функтор...
От: vopl Россия  
Дата: 28.08.18 14:37
Оценка:
Здравствуйте, nen777w, Вы писали:

N>
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>


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'


Особо не вчитывался в портянку, но попробую наугад трактовать полученную ошибку:
std::tuple_element_t — это уже готовый тип элемента туплы, ему не надо разыменовывать результат через "::type", смотри тут, раздел Helper types
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.