函数参数的C ++模板包

时间:2016-10-12 11:46:35

标签: c++ templates

是否可以创建一个接收函数指针的可变参数包的模板函数?

template<ReturnType (*FN)(), ReturnType (*FNX...)()>
void run() {
  ...
  run<FNX...>();
  ...
}

我试图将...放在我能想到的所有地方,但我无法将其编译。这不受支持吗?

1 个答案:

答案 0 :(得分:2)

你可以使用这种语法,但看起来很奇怪:

template<void(*... Functions)()>
void call_all()
{
    initializer_list<int>{(Functions(), 0)...};
}

我为这种类型添加了别名:

template <typename T>
using function_ptr = add_pointer_t<enable_if_t<is_function<T>::value,T>>;

template<function_ptr<void()>... Functions>
void call_all()
{
    initializer_list<int>{(Functions(), 0)...};
}

您还可以使用帮助程序类进行更高级的处理:

using fp = function_ptr<string()>;

template<fp First, fp... Others>
struct helper
{
    static void run()
    {
        helper<First>::run();
        helper<Others...>::run();
    }
};

template<fp One>
struct helper<One>
{
    static void run()
    {
        DBG(One());
    }
};

template<fp... Functions>
void run()
{
    helper<Functions...>::run();
}

live demo