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

标签 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 接受具有不同原型(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/

相关文章:

python - Pylons + Mako -- 从模板访问 POST 数据

C++ 集 - 并集、差集、交集 - 导致 vector 删除迭代器错误(超出范围)

c++ - 在 C++ 中将 vector <unsigned char> 转换为 HBITMAP

c++ - 段错误(核心转储)- 具有多维 vector 的循环 C++98

c++ - 已知参数的模板推导失败

templates - 表达式引擎论坛模块 URL

c++ - 显式删除 shared_ptr

javascript - 将参数传递给 Blaze 模板

c++ - 释放内存时出现严重错误

c++ - 如何在 Xcode 中选择正确的目的地?