可变参数模板是采用可变数量参数的模板。
我开始实现一个非常灵活的里程表。它可能有几个磁盘,每个不同的磁盘上的值数量甚至不同。而且,作为扩展,甚至每个值的数据类型......
如何创建递归可变参数模板来打印参数包的内容? 我正在尝试这个,但它无法编译: 模板 如何创建递归可变参数模板来打印出参数包的内容? 我正在尝试这个,但它无法编译: template <typename First, typename ...Args> std::string type_name () { return std::string(typeid(First).name()) + " " + type_name<Args...>(); } std::string type_name () { return ""; } 如何结束递归? 其实有一种非常优雅的方式来结束递归: template <typename Last> std::string type_name () { return std::string(typeid(Last).name()); } template <typename First, typename Second, typename ...Rest> std::string type_name () { return std::string(typeid(First).name()) + " " + type_name<Second, Rest...>(); } 我最初尝试了 template <typename Last> 和 template <typename First, typename ...Rest> 但这被认为是模棱两可的(其余可以是零元素)。然后这个问题向我展示了最终的解决方案:Compilation Error on Recursive Variadic Template Function 注意,为了避免一些代码重复,您还可以这样做: template <typename Last> std::string type_name () { return std::string(typeid(Last).name()); } template <typename First, typename Second, typename ...Rest> std::string type_name () { return type_name<First>() + " " + type_name<Second, Rest...>(); } 你需要使用部分特化来结束递归,但是由于你不能在C++中部分特化自由函数,所以你需要创建一个带有静态成员函数的实现类。 template <typename... Args> struct Impl; template <typename First, typename... Args> struct Impl<First, Args...> { static std::string name() { return std::string(typeid(First).name()) + " " + Impl<Args...>::name(); } }; template <> struct Impl<> { static std::string name() { return ""; } }; template <typename... Args> std::string type_name() { return Impl<Args...>::name(); } int main() { std::cout << type_name<int, bool, char, double>() << std::endl; // "i b c d" return 0; } 第一次声明 Impl 只是 g++ 4.6(及以下版本)中的一个缺点的解决方法。一旦它正确地实现了可变参数模板就没有必要了。 在 ideone.com 上实际查看它 C++17 的 if constexpr 允许您在一个模板声明中执行此操作,这与许多旧的解决方案不同,它非常容易理解: template <typename T, typename ...Args> std::string type_name() { if constexpr (!sizeof...(Args)) { return std::string(typeid(T).name()); } else { return std::string(typeid(T).name()) + " " + type_name<Args...>(); } } 作为函数不存在的偏特化的替代方法,您可以在类型化类上使用重载: #include <string> #include <iostream> #include <typeinfo> template <unsigned int N> struct NumberToType { }; template <typename T> std::string my_type_name(NumberToType<0> = NumberToType<0>()) { return std::string(typeid(T).name()); } template <typename T, typename ...Args> std::string my_type_name(NumberToType<sizeof...(Args)> = NumberToType<sizeof...(Args)>()) { return std::string(typeid(T).name()) + " " + my_type_name<Args...>(NumberToType<sizeof...(Args)-1>()); } int main() { std::cout << my_type_name<int, double, char>() << std::endl; } 作为替代方案,您可以就地解压参数包,如下例所示: #include<string> #include<iostream> #include<typeinfo> template <typename T, typename ...Args> std::string type_name () { std::string str = typeid(T).name(); int arr[] = { 0, (str += std::string{" "} + typeid(Args).name(), 0)... }; (void)arr; return str; } int main() { auto str = type_name<int, double, char>(); std::cout << str << std::endl; } 实际上不需要递归来做到这一点。 使用C++17折表达式: template <typename ...Args> std::string type_name () { return (std::string(typeid(Args).name()) + " " + ...); }
我相信这个问题以前有人问过,但我可能错了。是否可以对std::数组进行参数打包? 模板 < typename _Ty , typename... _Rest > requires .... _Rest > requires ...
如何在C++中用给定的伪代码创建一个递归的variadic函数?
我想做一个递归的变型模板函数,可以用下面的例子。这个例子没有显示出实用性,只是用来帮助更好地理解我的要求。那么,...
能否以某种方式存储一个参数包以备以后使用? Class Action { private: std::function f; T... args; /
多个遗产断言的可变模板----".用3个模板参数重新声明."
我想在AVR编程中实现自己的std::is_base_of(avr-gcc还不支持 . 我从cppreference页面的可能实现中得到灵感,它...
我有以下函数。它将T0和T1的两个绑定转换为一个元组的绑定。 功能如下模板 类型名 RxBinding
我有一个有多个参数包的变量模板类,类似于这样:模板 struct TopicsList { }; 模板 类TheParent; ...
我想为变量参数专门设计一个类模板:模板------------。 结构 TypeList { }; 模板 class Foo { }; /是否下一个 "特殊化 "甚至......。
例如模板 struct Index { enum {value = ???}? };并假设T是Ts中的一种,Ts有不同的类型,如Index ::值为0 ...
我有一个类,Delegate,是这样声明的: 模板。 class Delegate; template class Delegate { *......* }; 它可以....
下面的代码(抱歉篇幅太长,但这是我找到的唯一能重现错误的方法)在VS2013中无法编译。这似乎与扩展一个空参数有关......。
我有一个类,它有一个叫做enqueue的函数:模板。 inline auto ThreadPool::enqueue(T && t, Args&&... args) ->std::future
我试图用C++编写 "广义β函数"(https:/en.wikipedia.orgwikiBeta_function#Multivariate_beta_function)的代码。这是我的工作:模板 constexpr auto ...
比方说,我有下面这段代码。#include 模板 结构E {}; 模板 无效的func (E , Ts...) {...
如何使用这些包装器来实现printf sprintf_s?[关闭]
我如何调用这些封装器呢? 它们看起来像数组或其他东西,我很困惑 static auto w_printf = [](const char* fmt, ...) { va_list args; va_start(args, fmt); ...
从一个变量模板类中推导出类型包,并声明一个相同类型包的参数。
首先,对不起,问题标题不清楚,如果你想到更好的说明方式,欢迎编辑。我有一个类:模板 Class CSignal { 模板
我想实现一个变量类模板,其成员模板函数的模板参数是独立于类模板参数的,但我在定义成员 ...
我想为参数包使用一个使用别名,这样模板就可以在代码库的其他地方使用。在下面的代码中,我注释了我要使用类型的行:......。