无需模板特化,能否实现类容器的type类型追加功能?
不用模板特化实现类型列表的push_back功能
当然可以,完全不需要依赖类模板特化就能实现类型的追加。下面给两种实用方案:
方案一:给type_list内置成员模板
直接在type_list结构体里定义一个成员模板,用来生成追加新类型后的列表:
#include <iostream> #include <type_traits> template <typename... Args> struct type_list { // 成员模板,返回追加T后的新type_list template <typename T> using push_back = type_list<Args..., T>; }; int main() { type_list<int, bool> x; // 直接调用成员类型push_back来追加float typename decltype(x)::push_back<float> y; type_list<int, bool, float> z; std::cout << std::is_same_v<decltype(y), decltype(z)> << '\n'; // 输出1,说明类型一致 }
方案二:函数模板推导+decltype
如果想保持你原来代码里push_back_t<LIST, T>的用法,可以借助函数模板的自动推导能力,不用写任何模板特化:
#include <iostream> #include <type_traits> template <typename...> struct type_list {}; // 用函数模板推导原type_list的参数包,返回新的类型列表实例 template <typename... Args, typename T> constexpr auto push_back_impl(type_list<Args...>, T) { return type_list<Args..., T>{}; } // 通过decltype提取函数返回的类型,定义push_back_t template <typename LIST, typename T> using push_back_t = decltype(push_back_impl(LIST{}, T{})); int main() { type_list<int, bool> x; push_back_t<decltype(x), float> y; type_list<int, bool, float> z; std::cout << std::is_same_v<decltype(y), decltype(z)> << '\n'; // 输出1 }
这两种方案都避开了类模板特化:第一种靠内置成员模板直接展开参数包;第二种利用函数模板的参数推导特性,让编译器自动解析原type_list的模板参数,再通过decltype拿到最终的类型。
内容的提问来源于stack exchange,提问作者G. Adam
相关产品推荐
相关产品推荐

