Информация об изменениях

Сообщение Пытаюсь сочинить конфигурируемый функтор... от 28.08.2018 10:52

Изменено 28.08.2018 12:08 nen777w

Пытаюсь сочинить конфигурируемый функтор...
Основная идея, создать функтор который можно будет сконфигурировать в компайл тайм на синхронный или асинхронный вызов.

//собственно конфигурация
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<callback_emit_type<ASYNC>, int(int)> ff_a;


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

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

//собственно конфигурация
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() который я собираюсь использовать в реализации асинхронного вызова, но конфигурация его поведения происходит в рантайме...