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

Is it possible to have a branch of code conditionally be compiled in C++?

标题说明了一切。说明事务精神的示例代码:

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;
}

由于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;
}

标签发送。

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>());
}