C++ : meaning of keyword "typename" in this function

标签 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...中第一个元素的第一个元素相同,对吧?

最佳答案

不,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。在它前面,在这种情况下,它将被解析为一种类型。

关于C++ : meaning of keyword "typename" in this function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36831195/

相关文章:

c++ - 有什么简单的方法可以为 std::array 和 std::vector 实现算术运算?

c++ - 使用哪个,utf8 还是 Ascii

c++ - 对于用 C 编写的 AVR micro,Const Char 数组被修改为全 0

c++ - 如何禁用 Dev C++ 中的提示?

C++ 重载运算符 +

c++ - 编译器没有实现 "using typename"指令吗?

c++ - 在模板中返回一个迭代器

c++ - 为什么必须在哪里放置 “template”和 “typename”关键字?

c++ - 使用函数模板将迭代器返回到图节点

c++ - Efficient Ransac 的模板化内核存在问题