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...
中第一个元素的第一个元素相同,对吗?
答案 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
,在这种情况下它会被解析为一种类型。