Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
MegEngine 天元
MegEngine
提交
2faab90b
MegEngine
项目概览
MegEngine 天元
/
MegEngine
1 年多 前同步成功
通知
403
Star
4705
Fork
582
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
MegEngine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
提交
2faab90b
编写于
7月 20, 2020
作者:
M
Megvii Engine Team
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
feat(core): add a naive if_constexpr for C++14
GitOrigin-RevId: bd5811ebdef905ec478424916e6a9cda0505d1df
上级
8f42fe0d
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
40 addition
and
0 deletion
+40
-0
src/core/include/megbrain/utils/metahelper_basic.h
src/core/include/megbrain/utils/metahelper_basic.h
+40
-0
未找到文件。
src/core/include/megbrain/utils/metahelper_basic.h
浏览文件 @
2faab90b
...
...
@@ -73,6 +73,32 @@ namespace metahelper_detail {
static
std
::
false_type
test
(...);
using
type
=
decltype
(
test
(
reinterpret_cast
<
T
*>
(
0
)));
};
struct
if_constexpr_identity
{
template
<
typename
T
>
decltype
(
auto
)
operator
()(
T
&&
x
)
{
return
std
::
forward
<
T
>
(
x
);
}
};
template
<
bool
cond
>
struct
if_constexpr_impl
;
template
<
>
struct
if_constexpr_impl
<
true
>
{
template
<
class
Then
,
class
Else
>
static
decltype
(
auto
)
run
(
Then
&&
then
,
Else
&&
)
{
return
then
(
if_constexpr_identity
{});
}
};
template
<
>
struct
if_constexpr_impl
<
false
>
{
template
<
class
Then
,
class
Else
>
static
decltype
(
auto
)
run
(
Then
&&
,
Else
&&
else_
)
{
return
else_
(
if_constexpr_identity
{});
}
};
}
// namespace metahelper_detail
//! construct index_sequence<0..N-1>
...
...
@@ -304,6 +330,20 @@ T raw_cast(U&& u) {
return
x
.
t
;
}
//! functionally equivalent to "if constexpr" in C++17.
//! then/else callbacks receives an Identity functor as its sole argument.
//! The functor is useful for masking eager type check on generic lambda,
//! preventing syntax error on not taken branches.
template
<
bool
Cond
,
class
Then
,
class
Else
>
decltype
(
auto
)
if_constexpr
(
Then
&&
then
,
Else
&&
else_
)
{
return
metahelper_detail
::
if_constexpr_impl
<
Cond
>::
run
(
then
,
else_
);
}
template
<
bool
Cond
,
class
Then
>
decltype
(
auto
)
if_constexpr
(
Then
&&
then
)
{
return
if_constexpr
<
Cond
>
(
std
::
forward
<
Then
>
(
then
),
[](
auto
)
{});
}
}
// namespace mgb
// vim: syntax=cpp.doxygen foldmethod=marker foldmarker=f{{{,f}}}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录