c++ - 基于条件模板的代码执行 C++

标签 c++ templates boost

所以我已经为此奋斗了一段时间,这也是我在这里的第一篇文章。我只是想知道,如果我传入一个绝对是前向容器的容器,如 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/

相关文章:

c++ - Qt状态栏添加gif图片的方法

c++ - 静态编译会破坏ABI吗?

c++ - 自动销毁静态对象

c++ - boost 与标准原子顺序一致性语义

c++ - 两个应用程序如何监听一个端口?

c++ - 手动读取 Mysql 数据库文件

c++ - luabind:无法访问全局变量

c++ - 如何从 .NET 生成独立的控制台应用程序

c++ - 有没有办法使用模板特化将 new 与 new [] 分开?

visual-studio-2010 - 如何在 Visual Studio 2010 中编辑默认的 Razor Creat/编辑脚手架