仅使用typedef的c ++ struct语法的含义

时间:2016-08-17 17:55:21

标签: c++ struct syntax typedef

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

`project.dataset.table`

有人可以提供代码的一些解释吗?它试图做什么以及在体内只使用typedef语句的结构有什么好处?

2 个答案:

答案 0 :(得分:3)

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

元函数的方式类似于运行时函数。关键的区别在于元函数的输入参数是type(s),return也是type(s)。

EG。以下元函数采用一种类型,并返回您提供给它的类型的指针。

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

现在,如果你add_pointer<int>::type,它会返回int*。你看,你给它一个类型(在这种情况下是int),编译器计算了一个新类型(在这种情况下为int*)并在你调用::type时将它给了你元功能。当您对元函数执行::type时,就是在实例化模板时。这是调用函数的运行时等效项。另请注意,所有这些都发生在编译时!

现在,回到_TaskOfType_ContinuationTypeTraits。这跟我的add_pointer一样。在add_pointer中,我只有一个模板参数,你有两个。我刚刚添加了一个指向所提供类型的指针,你有一些更复杂的东西。但是,从它的本质来看,它只是一种类型计算。当我致电add_pointer时,我的::type会退回,当您致电::_TaskOfType时,我会这样做。

答案 1 :(得分:1)

这种语法用于创建&#34;模板化typedef&#34;。在C ++ 11及更高版本中,应该使用type aliases / alias templates代替。

您发布的代码段的目的是创建一个取决于_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"