0

我有以下类型别名:

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 或更高版本中实现这一点?

4

1 回答 1

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那里是不必要的,并且constexprC++17 中的 the 格式不正确(因为在 C++17 中你不能有 a constexpr std::vector)。

于 2019-02-07T15:53:49.547 回答