2012-02-06 101 views
2

http://www.boost.org/doc/libs/1_35_0/doc/html/boost/get_id405862.html为什么我们必须提供boost :: get的参数类型?

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

“*这是因为模板函数无法推断返回值的类型,因此我们必须为返回类型提供类型?*”是的,完全是 - 您回答了您自己的问题。 ; - ] – ildjarn 2012-02-06 19:39:47

回答

3

是因为该模板函数没有办法推断返回值的类型,所以我们要提供的返回类型的类型?

是的,在编译时没有办法推导出包含的类型。请记住variant在运行时包含T1, T2, ..., TN之一。

2

你不能推导出函数的返回类型,所以这是你需要指定的剩余模板参数。

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

换言之,您可以编译静态指令“让我输入U”,并且调用在运行时可能成功也可能不成功,这取决于当时变体的当前状态。

相关问题