gpt4 book ai didi

C++11:模板编程

转载 作者:太空狗 更新时间:2023-10-29 20:36:13 32 4
gpt4 key购买 nike

我有一些问题。下一个代码是什么意思?

template<typename> 
struct function_traits; // (1)

template<typename ClassType,
typename ReturnType,
typename... Arguments>
struct function_traits<ReturnType(ClassType::*)(Arguments...) const> { // (2)
...
};

template<typename T>
struct function_traits : public function_traits<decltype(&T::operator())> {};
// (3) Why here inheritance?

谢谢!

最佳答案

你觉得这是个谜是可以理解的。我们大多数人一开始都会这样做。

首先:

template<typename> 
struct function_traits; // (1)

这声明了具有一个模板参数的模板类的一般形式,该模板参数是一种类型(类 X、结构 Y、int、float、std::string,等等)。请注意,目前模板已声明,但无法从中实例化任何类,因为模板没有专门化。甚至不是默认的。

第二个:

template<typename ClassType,
typename ReturnType,
typename... Arguments>
struct function_traits<ReturnType(ClassType::*)(Arguments...) const> { // (2)
...
using result_type = ReturnType; // capture the template type into a typedef in the class namespace
};

这定义了模板的部分特化 function_traits<typename T>其中 T 是任何类的任何成员函数指针,它返回任何返回类型并采用任意数量的参数。因为ReturnType已经分配了一个模板参数,这意味着这个类的定义被允许将它作为一个类型来引用,从而推导出result_type成员函数。

但是,在这个阶段,特化没有用,因为调用者需要在调用点指定完整的函数指针,如下所示:function_traits<&SomeClass::someFunction>并且处理过载会很棘手。

现在第三部分做了一个“接口(interface)”特化,它说对于任何类T , function_traits<T>应来自 function_traits<&T::operator()> .

template<typename T>
struct function_traits : public function_traits<decltype(&T::operator())> {};
// (3) Why here inheritance?

因为模板扩展中有这样一个特定的匹配项,它只会针对具有调用运算符 ( operator() ) 的类型进行扩展。基类提供来自第二个特化的返回类型,因此该模板能够捕获任何具有调用运算符的类型的返回类型。因为此类派生自捕获返回类型的实际类,result_type也是此类范围的一部分。

现在我们可以写:

struct Foo {
int operator()();
};

using foo_ret = function_traits<Foo>::result_type;

foo_ret 将是 int .

还在迷茫?欢迎来到模板编程的前 6 个月。

关于C++11:模板编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39364484/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com