- 主题:这代码看的晕头转向的
template <typename Func, typename T> struct ContinuationReturnType {
using type = typename std::invoke_result<Func, T>::type;
};
template <typename Func> struct ContinuationReturnType<Func, void> {
using type = typename std::invoke_result<Func>::type;
};
template <typename Func, typename T> struct ContinuationFutureType {
using type = Future<typename RemoveFuture<
typename ContinuationReturnType<Func, T>::type>::type>;
};
template <typename Func, typename T>
using ContinuationFutureType_t = typename ContinuationFutureType<Func, T>::type;
--
FROM 27.208.36.*
这个技法在模板里很常用,就是模板偏特化,最终是为了推导出花括号里面的那个type值来用。
std库里面也大量用这种type traits技法,比如std::is_same、std::remove_reference等的实现代码
从你发的相关帖子看,可以先把C++11的东西学一下
--
修改:z16166 FROM 45.87.95.*
FROM 45.87.95.*
在学呢,大概了解一些关键字的用法,但这代码还是看的一头雾水,你帮我看一下下面这一段是什么意思?struct ContinuationFutureType 这个结构里不是定义了一个类型吗?怎么这段代码又调用成函数了?
return CesiumImpl::ContinuationFutureType_t<Func, T>(
this->_pSchedulers,
task.then(
scheduler,
CesiumImpl::WithTracing<T>::end(
tracingName,
std::forward<Func>(f))));
【 在 z16166 的大作中提到: 】
: 这个技法在模板里很常用,就是模板偏特化,最终是为了推导出花括号里面的那个type值来用。
: std库里面也大量用这种type traits技法,比如std::is_same、std::remove_reference等的实现代码
: 从你发的相关帖子看,可以先把C++11的东西学一下
: ...................
--
FROM 27.208.36.*
这个括号,可能是个对象构造,也可能是个仿函数(函数调用)。具体看上下文的代码。
CesiumImpl::ContinuationFutureType_t<Func, T>()
【 在 smthxes 的大作中提到: 】
: 在学呢,大概了解一些关键字的用法,但这代码还是看的一头雾水,你帮我看一下下面这一段是什么意思?struct ContinuationFutureType 这个结构里不是定义了一个类型吗?怎么这段代码又调用成函数了?
: return CesiumImpl::ContinuationFutureType_t<Func, T>(
: this->_pSchedulers,
: ...................
--
FROM 114.241.228.*
上下文就是上面我主贴里的代码,这段没看明白,struct ContinuationFutureType结构里好像是定义了一个类型?这是什么用法?
template <typename Func, typename T> struct ContinuationFutureType {
using type = Future<typename RemoveFuture<
typename ContinuationReturnType<Func, T>::type>::type>;
};
【 在 z16166 的大作中提到: 】
: 这个括号,可能是个对象构造,也可能是个仿函数(函数调用)。具体看上下文的代码。
: CesiumImpl::ContinuationFutureType_t<Func, T>()
:
--
FROM 27.208.36.*
这就是type traits技法
里面定义的这个type,最后通过 ContinuationFutureType<Func, T>::type 来使用。
type的值(其值是个类型)是跟着模板参数Func、T变化的,
也就是不同的Func、T,会推导出不同的type。
变化是通过模板偏特化来实现的。可以认为等价于一个switch/case语句。
也就是实现下面的类型推导:
if (Func == func1 && T == t1)
type = type1
else if (Func == func2 && T == t2)
type = type2
else
type = typeN // 默认情况,无偏特化
具体的例子,可以搜一下type traits、模板偏特化的讲解帖子
【 在 smthxes 的大作中提到: 】
: 上下文就是上面我主贴里的代码,这段没看明白,struct ContinuationFutureType结构里好像是定义了一个类型?这是什么用法?
: template <typename Func, typename T> struct ContinuationFutureType {
: using type = Future<typename RemoveFuture<
: ...................
--
修改:z16166 FROM 114.241.228.*
FROM 114.241.228.*
查了一上午,大概明白你说的这个意思,现在主要是不明白,这个type在struct ContinuationFutureType结构里定义是咋回事?结构里不是应该定义变量和函数吗?还有最后又怎么是CesiumImpl::ContinuationFutureType_t<Func, T>()这样的方式构造和调用?ContinuationFutureType结构里没有构造函数啊
【 在 z16166 的大作中提到: 】
: 这就是type traits技法
: 里面定义的这个type,最后通过 ContinuationFutureType<Func, T>::type 来使用。
: type的值(其值是个类型)是跟着模板参数Func、T变化的,
: ...................
--
修改:smthxes FROM 27.208.36.*
FROM 27.208.36.*
结构里面是可以用typedef/using定义类型的
CesiumImpl::ContinuationFutureType_t<Func, T>() 这个是个啥,也可以对比看汇编代码,看看这里生成的汇编代码干了些啥。你贴的上下文不全。按说是和Future()有关。
【 在 smthxes 的大作中提到: 】
: 查了一上午,大概明白你说的这个意思,现在主要是不明白,这个type在struct ContinuationFutureType结构里定义是咋回事?结构里不是应该定义变量和函数吗?还有最后又怎么是CesiumImpl::ContinuationFutureType_t<Func, T>()这样的方式构造和调用?ContinuationFutureType结构里没有构造函数啊
:
--
修改:z16166 FROM 114.241.228.*
FROM 114.241.228.*
只是在结构里定义个类型怎么用啊?可以直接用类型生成构造函数吗?这个用法还是不太理解
【 在 z16166 的大作中提到: 】
:
: 结构里面是可以用typedef/using定义类型的
:
: CesiumImpl: : ContinuationFutureType_t() 这个是个啥,也可以对比看汇编代码,看看这里生成的汇编代码干了些啥。你贴的上下文不全。
: --
:
发自「今日水木 on MHA-AL00」
--
FROM 223.104.190.*
struct无非是个特殊的class,class里面可以定义public/private/protected的自定义类型,那么struct里也可以定义public的自定义类型,外面可以直接引用这些类型。
简化一下,去掉干扰的东西,逐步替换回去,就是:
ContinuationFutureType_t<Func, T>
= ContinuationFutureType<Func, T>::type
= Future<ContinuationReturnType<Func, T>::type>::type>
下面要分两种情况:
= Future<std::invoke_result<Func, T>::type>::type> // 默认的一般情况
= Future<std::invoke_result<Func>::type>::type> // T为void时的偏特化情况
所以ContinuationFutureType_t<Func, T>( ) 实际上就是Future<Func, T>()
Future这个不是std里的,具体要看看它的ctor代码、operator()的代码
【 在 smthxes 的大作中提到: 】
: 只是在结构里定义个类型怎么用啊?可以直接用类型生成构造函数吗?这个用法还是不太理解
: 发自「今日水木 on MHA-AL00」
--
修改:z16166 FROM 114.241.228.*
FROM 114.241.228.*