c ++:此函数中关键字“typename”的含义

时间:2016-04-25 02:34:27

标签: c++ typename

this来自this问题的答案中,作者发布了以下代码:

 template <typename... Ts>
    typename std::tuple_element<0, std::tuple<Ts...> >::type // or decltype(auto) 
        callFunction(Ts&&... ts)
    {
        using type = typename std::tuple_element<0, std::tuple<Ts...> >::type;
        auto it = multiCache.find(typeid(type));
        assert(it != multiCache.end());
        auto&& fn = boost::any_cast<const std::function<type(Ts...)>&>(it->second);
        return fn(std::forward<Ts>(ts)...);
    }

typename std::tuple_element<0, std::tuple<Ts...> >::type的含义是返回的类型与Ts...中第一个元素的第一个元素相同,对吗?

1 个答案:

答案 0 :(得分:1)

不,出于所有实际目的,typename关键字与class的含义相同。

区别在于语义上的差异。在模板函数或类的上下文中,typename也可以是POD,而不是正式声明的类。它的字面意思是“任何类型,POD或类”,松散地说。

关键字typename通常意味着什么。在这种情况下,这有一个特定的目的:

typename std::tuple_element<0, std::tuple<Ts...> >::type

这告诉编译器期望std::tuple_element<0, std::tuple<Ts...> >中的“类型”也将是class(或typedef),而不是类成员。

如果您有类似的内容:

classname::identifier

这可以指代类型或类成员:

class X {

public:
     typedef int y;
     int z;
};

此处,X::y表示类型,X::z表示类成员。在解析模板时,C ++编译器默认假设“A :: b”将引用一个类成员,除非你在它前面粘贴一个typename,在这种情况下它会被解析为一种类型。