我有以下类型别名:
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
接受可变数量的函数,所有函数都具有不同的原型。在实际实现中,保留每个函数的类型信息以供其他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
那里是不必要的,而constexpr
C++17 中的the使这种格式不正确(因为您不能在 C++17 中使用constexpr
std::vector
)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句