如何实现IF-ELSE条件模板
How to implement If-Else Conditional template?
我有Conditional
模板
template<bool C, typename ...>
struct Conditional {
};
template<typename C1, typename C2>
struct Conditional<true, C1, C2> {
typedef C1 value;
};
template<typename C1, typename C2>
struct Conditional<false, C1, C2> {
typedef C2 value;
};
似乎按预期工作:
<Conditional<(0 != 1), Int<0>, Int<1>>::value; // Int<0>
<Conditional<(0 == 1), Int<0>, Int<1>>::value, // Int<1>
,但它在返回之前评估所有值:
template<typename G, typename M>
struct DoMove {
private:
constexpr static bool _isRLMove = (M::direction == Direction::LEFT || M::direction == Direction::RIGHT);
public:
using result = typename Conditional<
_isRLMove, typename DoMoveRL<G, M>::result, typename DoMoveUD<G, M>::result>::value;
// ^ when _isRLMove == false evaluates this
};
导致DoMoveRL
的编译错误。
一个人如何根据条件进行评估?我在这里缺少什么?
DoMoveRL<G, M>::result
强制DoMoveRL<G, M>
的实例化。
您可能会延迟result
的检索以避免强制实例化:
template<typename G, typename M>
struct DoMove {
private:
constexpr static bool _isRLMove = (M::direction == Direction::LEFT
|| M::direction == Direction::RIGHT);
public:
using result = typename Conditional<
_isRLMove, DoMoveRL<G, M>, DoMoveUD<G, M>>::value::result;
};
有几种方法可以解决这个问题。传统上,添加间接层(实时示例(:
template<bool C, template<typename ...> class...>
struct Conditional {
};
template<template<typename...> class C1, template<typename...> class C2>
struct Conditional<true, C1, C2> {
template<typename... Ts>
using apply = C1<Ts...>;
};
template<template<typename...> class C1, template<typename...> class C2>
struct Conditional<false, C1, C2> {
template<typename... Ts>
using apply = C2<Ts...>;
};
using result = typename Conditional<_isRLMove, DoMoveRL, DoMoveUD>::template apply<G, M>::result;
如果实例化模板本身是可以的,只能访问result
断裂,则可以简化一点。我已经解释了模板本身。
在C 17中,如果您喜欢这样的话,可以使用if constexpr
(实时示例(:
template<typename T> struct type_val { using type = T; };
static auto choose_type() {
if constexpr (_isRLMove) {
return type_val<typename DoMoveRL<G, M>::result>{};
} else {
return type_val<typename DoMoveUD<G, M>::result>{};
}
}
using result = typename decltype(choose_type())::type;
相关文章:
- 我的简单if-else语句是如何无法访问的代码
- 如何删除peer if else分支中的冗长句子
- 我似乎对if/else的基本语句有问题:/
- 使用if-else将数字转换为单词
- 为什么这个案例陈述需要一个"if else"而不仅仅是一个"if"?
- 如果条件不相关,我应该更喜欢两个 if 语句而不是 if-else 语句吗?
- 如何实现IF-ELSE条件模板
- 循环中的IF-ELSE条件:未来的迭代覆盖以前的迭代结果
- 如何在没有'switch'和'if-else'条件的情况下重写以下代码?
- 有没有办法将派生类作为 if-else 语句中的条件传递?
- 同时执行 if 和 else 条件的逻辑是什么
- C++ 优化 if/else 条件
- 使用try-Catch异常处理程序和if-else条件检查之间的区别
- 编译时已知条件下的标准if/else
- if/else语句中存在多个条件
- 嵌套的if-else语句只执行一个条件(c++)
- If then else条件被跳过
- If和Else条件都执行c++
- if-else 语句中的条件计算不正确
- 如何在 if-else 阶梯中针对特定条件放置互斥锁和解锁?