基于条件模板的代码执行 C++
conditional template based code execution c++
所以我已经为此斗争了一段时间,这也是我在这里的第一篇文章。我只是想知道,如果我传入的容器绝对是 boost 中定义的前向容器,我如何以进一步检查代码的方式编写代码以查看代码是 BackInsertionSequence 还是 FrontInsertionSequence 并根据它的类型执行?
template <class SequentialContainer>
void MyClass<SequentialContainer>::SaySomething() {
BOOST_CONCEPT_ASSERT((boost::ForwardContainer<SequentialContainer>));
if (boost::BackInsertionSequence<SequentialContainer> == true) {
//do something
} else {
//say something else
}
}
如果你像那里一样做了一个if
检查,那么无论只有一个分支会被执行特定类型,都必须编译两个分支。这严重限制了简单if
的有用性 - 您需要一个结构,以便只有一个分支甚至可以编译。
有两种常见的方法可以做到这一点。标签调度:
template <class SequentialContainer>
void MyClass<SequentialContainer>::SaySomething() {
SaySomething<SequentialContainer>(
is_back_insertion_sequence<SequentialContainer>{}
);
}
template <class SequentialContainer>
void SaySomething(std::true_type /* back insertion sequence */ ) { ... }
template <class SequentialContainer>
void SaySomething(std::false_type /* NOT back insertion sequence */ ) { ... }
和SFINAE:
template <class SequentialContainer>
typename std::enable_if<
is_back_insertion_sequence<SequentialContainer>::value
>::type
SaySomething() {
/* back insertion sequence */
}
template <class SequentialContainer>
typename std::enable_if<
!is_back_insertion_sequence<SequentialContainer>::value
>::type
SaySomething() {
/* NOT back insertion sequence */
}
两者都有优点和缺点,但如果它只是你正在检查的一个标志 - 这主要是一个意见问题。
这是一个 C++14 尝试纯粹在函数内执行编译时分支。 我不知道这是否是一个好主意。
template<
template<class...>class Test, class Arg,
class F1, class F2,
class=std::enable_if_t<
Test<Arg>{}
>
>
std::result_of_t< F1(Arg) > branch( Arg&& arg, F1&& f1, F2&& f2 ) {
return std::forward<F1>(f1)(std::forward<Arg>(arg));
};
template<
template<class...>class Test, class Arg,
class F1, class F2,
class=std::enable_if_t<
!Test<Arg>{}
>
>
std::result_of_t< F2(Arg) > branch( Arg&& arg, F1&& f1, F2&& f2 ) {
return std::forward<F2>(f2)(std::forward<Arg>(arg));
};
这是一个编译时分支器。 然后我们这样做:
template <class SequentialContainer>
void SaySomething() {
branch<boost::BackInsertionSequence>( container,
[&](auto&& container){ // true
}, [&](auto&& container){ // false
});
}
在这里,我们测试container
以确定它是否是 boost::BackInsertionSequence
. 如果是这样,我们运行第一个分支,如果不是第二个分支。
根据该标准,每个分支中的代码必须具有有效的专用化:这就是我传递容器的原因。 我们可以假设测试的容器在代码中具有我们想要的属性。
相关文章:
- 以下代码执行哪种内存分配(动态或静态)?
- 允许多个互斥锁所有者或指定数量的并发代码执行
- 使用 execv 从C++代码执行的 Linux 脚本失败
- 由于找不到cpprest_2_10.dll,代码执行无法继续
- 在每次循环迭代时停止代码执行毫秒
- 与Java相比,为什么此C 代码执行速度如此慢
- 记录组件代码执行
- 相同的代码执行两次:性能差异
- 代码执行/CPU 速度每 2 秒减慢一次
- 函数返回本地变量,尽管变量不超出范围,没有编译器问题,并且代码执行
- 如何将字符串从C++DLL返回到MetaTrader 4代码执行生态系统?
- 当我从java代码执行C++时不显示任何输出
- C++和共享库中的代码执行点
- 递归期间代码执行中断
- 为可选的评测代码执行进行高效设计
- 我正在尝试使用 ifstream 将此 C 函数的等效代码执行到 c++ 中
- 最佳C 11测量嵌入式系统代码执行时间的方法
- 如何在iOS应用程序中锁定代码执行
- 中断代码执行
- 是否有一个工具来记录代码执行