c++ - 交替模板参数包

标签 c++ c++17 c++20

如何实现一组交替模板参数?

像这样:

template< ( unsigned non_type, typename type )... >

用法必须在什么地方

my_class< 5U, float,
          6U, std::string >

我不想更改顺序,也不想在使用过程中将它作为一对包装器。显然,如果它在我自己的内部实现中变成某种配对,那很好。

最佳答案

关于模板要记住的是它们不是宏。他们没有复制代币。它们是实际的 C++ 结构。每个模板参数都必须是特定类型的:类型参数、非类型参数或必须指定其模板参数列表的模板-模板参数。模板参数的种类让编译器知道在特定位置使用该参数是否有意义。

例如,这是一段可能有意义的代码:

template<auto value>
auto foo() {return value + 1;}

这显然是胡说八道:

template<typename value>
auto foo() {return value + 1;}

编译器甚至不必等你实例化模板就可以关闭你。

使用参数包的唯一方法是在某个位置展开它。扩展参数包会将使用该包的模式应用于包的所有元素。构建类型和值都适合模式语法的场景非常困难。

当然,这并非不可能。例如,(pack(something), ...) 对于类型和非类型模板参数都是合法的。但他们不会做同样的事情。对于值,它将调用类型上任何可用的 operator();对于类型,它将调用构造函数来创建纯右值。

最普遍有用的情况是将异构包直接扩展到模板参数列表中。

然而,所有这些都是诡辩,因为 C++ 模板不是宏。模板参数必须是定义明确的类型,这样编译器才能知道它们是否被正确使用。这包括参数包。所以包中的所有元素必须属于同一类。你想要的是“universal template parameters”,但目前只是一个提议。

关于c++ - 交替模板参数包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61002624/

相关文章:

c++ - 数组元素和指针值上的新布局

c++ - 是否有任何标准功能可用于创建以容器为 mapped_type 的 map 的平面 View ?

c++ - 在现代 C++11/C++14/C++17 和 future 的 C++20 中枚举到字符串

c++ - using 指令不适用于 c++20 概念吗?

c++ - 如何将 char* 数组转换为 std::string

c++ - -> 在智能指针中的用法

c++ - 多线程随机数生成瓶颈

c++ - 在 C++20 获得批准之前,我应该如何处理时代以来的值?

c++ - cpp 进程无法访问该文件,因为它正被另一个进程使用

c++ - 用c++读取音乐文件名