- 主题:这代码看的晕头转向的
这个技法在模板里很常用,就是模板偏特化,最终是为了推导出花括号里面的那个type值来用。
std库里面也大量用这种type traits技法,比如std::is_same、std::remove_reference等的实现代码
从你发的相关帖子看,可以先把C++11的东西学一下
--
修改:z16166 FROM 45.87.95.*
FROM 45.87.95.*
这个括号,可能是个对象构造,也可能是个仿函数(函数调用)。具体看上下文的代码。
CesiumImpl::ContinuationFutureType_t<Func, T>()
【 在 smthxes 的大作中提到: 】
: 在学呢,大概了解一些关键字的用法,但这代码还是看的一头雾水,你帮我看一下下面这一段是什么意思?struct ContinuationFutureType 这个结构里不是定义了一个类型吗?怎么这段代码又调用成函数了?
: return CesiumImpl::ContinuationFutureType_t<Func, T>(
: this->_pSchedulers,
: ...................
--
FROM 114.241.228.*
这就是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.*
结构里面是可以用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.*
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.*
大佬可以给讲讲用if constexpr怎么搞
【 在 hongdiao 的大作中提到: 】
:
: 偏特化的很多场合,在有了新的 if constexpr 之后就有更加简单直观的替换者了吧?
--
FROM 114.241.228.*