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

C++ Variable number of variadic template parameters

本文关键字:参数 变参 C++      更新时间:2023-10-16

我有以下类型别名:

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 或以后实现这一目标?

你实际上并不关心这些底层类型中的任何一个(至少在这里提供的代码中不关心(。所以只是不要使用它。你所关心的只是这些东西都是函数指针:

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(。