Сообщение Пытаюсь сочинить конфигурируемый функтор... от 28.08.2018 10:52
Изменено 28.08.2018 12:08 nen777w
Пытаюсь сочинить конфигурируемый функтор...
Основная идея, создать функтор который можно будет сконфигурировать в компайл тайм на синхронный или асинхронный вызов.
использование:
Но что то не получается никак...
У меня вообще уже сомнения закрались, можно ли такое сделать?
Вот есть 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<callback_emit_type<ASYNC>, int(int)> ff_a;
Но что то не получается никак...
У меня вообще уже сомнения закрались, можно ли такое сделать?
Вот есть std::async() который я собираюсь использовать в реализации асинхронного вызова, но конфигурация его поведения происходит в рантайме...
Пытаюсь сочинить конфигурируемый функтор...
Основная идея, создать функтор который можно будет сконфигурировать в компайл тайм на синхронный или асинхронный вызов.
использование:
Но что то не получается никак...
У меня вообще уже сомнения закрались, можно ли такое сделать?
Вот есть 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() который я собираюсь использовать в реализации асинхронного вызова, но конфигурация его поведения происходит в рантайме...