我有以下类型别名:
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), ...) };
}
};
我知道这是无效语法,因为 Return
和 Args
在其模板组之外无法解析。目标是允许函数 registerFunction
接受具有不同原型(prototype)的可变数量的函数。在实际实现中,重要的是保留每个函数的类型信息,以便与其他 constexpr
函数一起使用。有没有办法在 C++17 或更高版本中实现这一点?
最佳答案
您实际上并不关心这些底层类型中的任何一个(至少在此处提供的代码中不关心)。所以不要使用它。你只关心这些东西都是函数指针:
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
std::vector
)。
关于C++ 可变数量的可变模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54576950/