Я пытаюсь создать класс шаблона, который выполняет заданную пользователем N -ary функцию с аргументами типа C. Для этого мне нужно каким-то образом указать тип этой функции на основе параметров шаблона. Следующий код иллюстрирует мою проблему:Изменение параметра списка функции на основе параметра шаблона?
template <typename C, size_t N>
class NaryDispatch {
typedef typename std::function<void(/* N parameters of type C& */)> NaryFn;
public:
NaryDispatch(NaryFn f) : m_function(std::forward<NaryFn>(f)) {}
private:
NaryFn m_function;
};
Я не смог найти способ, чтобы построить тип станда :: функции с подписью соответствующей валентности. Я использую C++ 11 и Boost :: MPL, поэтому решения, связанные с ними, более чем приветствуются. Я пытался использовать SFINAE/параметр вывод шаблона на параметр конструктора следующим образом:
template <
class... Args,
typename std::enable_if<sizeof...(Args) == N, C>::type = 0
>
NaryDispatch(std::function<void(Args&...)> fn) : m_function(std::forward<???>(fn)) {}
Как вы можете видеть, проблема здесь в том, что, поскольку я не смог определить тип функции будет взять данный шаблон параметры C и N, я не могу определить тип члена класса, в котором должна храниться функция.
Чтобы упростить мое намерение немного, для параметров шаблона C и N, конструктор класса должен принимать (и хранить в частном члена) в std::function
, который возвращает void
и принимает N параметров типа C&
. Например, необходимо скомпилировать:
NaryDispatch<int, 3> disp([](int a, int b, int c) {});
Заранее благодарим за любые идеи, которые вы могли бы предложить.
Изменить 'арг ...' 'в Args и ...', так как он хочет ссылки. – 0x499602D2
[Демо] (http://ideone.com/bqUyMd) –
@ 0x499602D2: Выполнено. –