C ++可变数量的可变参数模板参数

时间:2019-02-07 15:39:08

标签: c++ templates vector c++17 variadic-functions

我具有以下类型别名:

using VoidFunc = void (*)();

我想这样定义一个类:

class SomeClass {
public:

 template<template<typename Return, typename... Args>... Funcs>
 static constexpr typename std::vector<VoidFunc> registerFunctions(Funcs<Return, Args...>... funcs) {
  return { ((VoidFunc)(funcs), ...) };
 }
};

我知道这是无效的语法,因为ReturnArgs在其模板组之外无法解析。目的是允许函数registerFunction接受数量可变的函数,这些函数都具有不同的原型。在实际的实现中,重要的是保留每个函数的类型信息以与其他constexpr函数一起使用。有没有一种方法可以在C ++ 17或更高版本中实现?

1 个答案:

答案 0 :(得分:4)

您实际上并不关心这些底层类型中的任何一个(至少不在此处显示的代码中)。因此,请不要使用它。您只关心这些都是函数指针:

typename <typename... F>
static std::vector<VoidFunc> registerFunctions(F*... funcs)
{
    static_assert((std::is_function_v<F> && ...));
    return { reinterpret_cast<VoidFunc>(funcs)... };
}

如果需要需要其他签名,则可以将funcs的每个元素传递到不同的函数模板中,然后在此处重新推导实际签名。


请注意,typename在那里是不必要的,并且C ++ 17中的constexpr使其格式不正确(因为在C ++ 17中您不能拥有constexpr {{ 1}})。