是否有可能在C ++中有条件地编译代码分支?

时间:2015-02-24 16:08:57

标签: c++11 metaprogramming boost-mpl

标题说真的。示例代码,说明事件的精神ep>

if( std::is_constructible<T, unsigned long>::value )
{
    unsigned long identity = collection.rbegin()->first + 1;
    std::shared_ptr<T> newObject(new T(identity));

    collection.insert( identity , newObject );
    return true;
}
else
{
    return false;
}

2 个答案:

答案 0 :(得分:3)

标签发送。

template<class T>
bool foo_impl(std::true_type){
    unsigned long identity = collection.rbegin()->first + 1;
    std::shared_ptr<T> newObject(new T(identity));
    collection.insert( identity , newObject );
    return true;
}

template<class T>
bool foo_impl(std::false_type){
    return false;
}

template<class T>
bool foo(){
    return foo_impl<T>(std::is_constructible<T, unsigned long>());
}

答案 1 :(得分:2)

由于if语句可以在编译时确定,我希望编译器很聪明并直接对其进行优化,就好像你有类似的东西一样

if ( true ) {
    // Some code
}
else {
    // Anything here any decent compiler will ignore.
}

另一种选择是在函数中包含所需的行为,并使用std::enable_if

template <typename T, typename = typename enable_if<is_constructible<T, int>::value>::type>
bool foo() {
    return true;   
}

template <typename T, typename = typename enable_if<!is_constructible<T, int>::value>::type>
bool foo() {
    return false;
}

// ...

return foo<T>();

示例:http://ideone.com/sgNVr5

另一种选择是专注于布尔值:

template <bool b> bool foo();

template <>
bool foo<true>(){
    return true;
}

template <>
bool foo<false>() {
    return false;
}