C++能否根据模板参数个数声明类型别名且无需模板特化
问题原因
你给出的代码报错是因为if constexpr仅允许在函数/块作用域内使用,无法直接放在类的顶层作用域中做类型声明,因此不能直接用它定义类内的类型别名。
解决方案
无需使用模板特化,直接借助标准库提供的编译期类型选择工具std::conditional_t即可实现需求,完整实现代码如下:
#include <tuple> #include <type_traits> template <typename... Args> struct KeyPolicy { using KeyType = std::conditional_t< sizeof...(Args) == 1, std::tuple_element_t<0, std::tuple<Args...>>, std::tuple<Args...> >; static KeyType getKey(const Args&... args) { return KeyType{args...}; } };
验证示例
#include <string> // 单参数场景:KeyType 等于参数本身类型 static_assert(std::is_same_v<KeyPolicy<std::string>::KeyType, std::string>); // 多参数场景:KeyType 为包含所有参数的 std::tuple static_assert(std::is_same_v<KeyPolicy<int, double, char>::KeyType, std::tuple<int, double, char>>);
如果需要兼容C++11标准,只需将std::conditional_t替换为typename std::conditional<sizeof...(Args) == 1, typename std::tuple_element<0, std::tuple<Args...>>::type, std::tuple<Args...>>::type即可。
内容的提问来源于stack exchange,提问作者basyuni
相关产品推荐
相关产品推荐

