C++11:模板编程

C++11: Template programming

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

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)

这声明了模板的一般形式class,它有一个模板参数,它是一种类型(class X, struct Y, int, float, std::string, whatever ).请注意,目前模板已声明,但无法从中实例化 classes,因为模板没有专门化。甚至不是默认的。

第二个:

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 是任何 class 的任何成员函数指针,return 是任何 return 类型并采用任何数字的论据。因为ReturnType已经被赋值了一个模板参数,也就是说这个class的定义允许将它作为一个类型来引用,从而推导出成员函数的result_type

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

现在,第三部分进行了 'interface' 特化,表示对于任何 class Tfunction_traits<T> 应派生自 function_traits<&T::operator()>

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

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

现在我们可以写:

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

using foo_ret = function_traits<Foo>::result_type;

而 foo_ret 将是 int

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