所以我已经为此奋斗了一段时间,这也是我在这里的第一篇文章。我只是想知道,如果我传入一个绝对是前向容器的容器,如 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++ - 基于条件模板的代码执行 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30920140/