为什么我们必须为boost :: get提供参数类型?

时间:2012-02-06 19:35:54

标签: c++ boost

http://www.boost.org/doc/libs/1_35_0/doc/html/boost/get_id405862.html

template<typename U, typename T1, typename T2, ..., typename TN> 
  U & get(variant<T1, T2, ..., TN> & operand);

仅当内容属于指定类型U时才会成功。

boost::get是模板功能吗?

大多数情况下,当我们调用模板函数时,函数本身可以推导出参数类型,因此我们不必手动输入类型。

为什么在这种情况下我们必须手动提供类型?是因为模板函数无法推断出返回值的类型,所以我们必须提供返回类型的类型吗?

  boost::variant<int, std::string> my_first_variant;

  my_first_variant = 10;

  assert( boost::get<int>(my_first_variant) == 10)
                      ^

2 个答案:

答案 0 :(得分:3)

  

是不是因为模板函数无法推断出返回值的类型所以我们必须提供返回类型的类型?

是的,在编译时无法推断出包含的类型。请注意,variant在运行时包含T1, T2, ..., TN之一。

答案 1 :(得分:2)

您无法推断出函数的返回类型,因此这是您需要指定的剩余模板参数。

另请注意,模板是编译时代码生成器,而boost::variant包含在运行时中不同的任何给定类型集合。因此,“自动检索当前类型”是没有意义的,因为这不是一个静态概念。

换句话说,您编译静态指令“get me type U”,并且调用在运行时可能会或可能不会成功,具体取决于当时变体的当前状态。