You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何无需显式指定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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 00:42:39