【问题标题】:meaning of c++ struct syntax with only typedef只有 typedef 的 c++ struct 语法的含义
【发布时间】:2016-08-17 17:55:20
【问题描述】:

当我检查一些库中的一些代码片段时,我看到了一些这样的代码:

template<typename _Function, typename _ReturnType>
struct _TaskOfType_ContinuationTypeTraits
{
    typedef task<typename _TaskTypeTraits<typename _FunctionTypeTraits<_Function, _ReturnType>::_FuncRetType>::_TaskRetType> _TaskOfType;
};

有人可以对代码进行一些解释吗?它试图做什么以及在正文中使用只有 typedef 语句的结构有什么好处?

【问题讨论】:

  • 您可能会发现查找模板元编程很有帮助。

标签: c++ struct syntax typedef


【解决方案1】:

用 C++ 的说法,_TaskOfType_ContinuationTypeTraits 是一个元函数。它在编译时进行类型计算。

元函数在某种程度上类似于运行时函数。主要区别在于元函数的输入参数是类型,返回也是类型。

例如。以下元函数接受一个类型,并返回您提供给它的类型的指针。

template <typename T>
struct add_pointer
{
    typedef T* type;
}

现在,如果您执行add_pointer&lt;int&gt;::type,它会返回int*。你看,你给了它一个类型(在本例中为int),编译器计算了一个新类型(在本例中为int*)并在你调用元函数的::type 时将其返回给你。当您在元函数上执行::type 时,就是实例化模板的时候。这是调用函数的运行时等效项。另请注意,所有这些都发生在编译时!

现在,回到您的_TaskOfType_ContinuationTypeTraits。这就像我的add_pointer。在add_pointer,我只有一个模板参数,你有两个。我刚刚添加了一个指向提供的类型的指针,你有一些更复杂的东西。但是,从本质上讲,它只是一种类型计算。我的add_pointer 会在我调用::type 时返回,你的::_TaskOfType 会返回。

【讨论】:

  • 不错!现在有肉了! +1
  • 我认为您的回答与解释这种语法的目的(优势)更相关。而且您的示例更容易理解并且也很有意义。最终它正在计算类型。但@Vittorio Romeo 的回答也很有意义。
【解决方案2】:

这种语法用于创建“模板化类型定义”。在 C++11 及以上版本中,应使用type aliases / alias templates

您发布的代码 sn-p 的目的是创建一个依赖于 _Function_ReturnType 的类型别名。

可以这样访问:

typename _TaskOfType_ContinuationTypeTraits<F, R>::_TaskOfType

如果您可以访问 C++11,这是一个更清洁、更好、更直接的解决方案:

template<typename _Function, typename _ReturnType>
using _TaskOfType = 
    task<typename _TaskTypeTraits<
        typename _FunctionTypeTraits<_Function, _ReturnType>::_FuncRetType>::_TaskRetType>

可以这样使用:

_TaskOfType<F, R>

更多信息:"Difference between typedef and C++11 type alias"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2011-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多