如何无需显式指定pair构造,让编译器自动推导初始化列表为模板实例?
实现自动将初始化列表推导为pair模板实例
先看你定义的pair模板结构体:
#include <string> #include <type_traits> template <typename TValue> struct pair { std::string key; TValue value; template <typename T> struct no_overload_error : std::false_type {}; bool check() const { static_assert(no_overload_error<TValue>::value, "Cannot check this data type."); // 此处添加对应数据类型的检查逻辑 return true; } }; // 针对bool类型特化,允许check()调用 template<> struct pair<bool>::no_overload_error<bool> : std::true_type {}; // 同理可添加int、double等支持的类型特化 template<> struct pair<int>::no_overload_error<int> : std::true_type {}; template<> struct pair<double>::no_overload_error<double> : std::true_type {};
当前check_values函数需要显式构造pair实例才能调用,要实现直接用{"key", value}初始化列表的调用方式,只需两步:
1. 添加类模板推导指引
在pair结构体定义之后,添加推导指引,让编译器能从初始化列表的参数推导出pair的模板参数:
template <typename TValue> pair(std::string, TValue) -> pair<TValue>;
这条指引告诉编译器:当遇到用std::string和TValue类型的值初始化pair时,自动推导该实例为pair<TValue>。
2. (可选)优化check_values函数实现
为避免不必要的拷贝,同时简化代码,可以用C++17的折叠表达式替代递归,并且支持万能引用:
template <typename... Pairs> void check_values(Pairs&&... pairs) { (std::forward<Pairs>(pairs).check(), ...); }
这个版本既支持左值、右值的pair实例,也能直接接收初始化列表(编译器会通过推导指引自动转换为对应pair类型)。
现在你就能按预期方式调用check_values了:
int main() { check_values({"name of bool val", true}, {"some int", 24}, {"a double", 1.5}); return 0; }
内容的提问来源于stack exchange,提问作者Tomáš Zato
相关产品推荐
相关产品推荐

