当我从一些库中检查一些代码片段时,我看到了一些像这样的代码:
`project.dataset.table`
有人可以提供代码的一些解释吗?它试图做什么以及在体内只使用typedef语句的结构有什么好处?
答案 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>