在 if-else 块中实现类似 SFINAE 的效果

Achieving an SFINAE-like effect in an if-else block

本文关键字:SFINAE if-else 实现      更新时间:2023-10-16

我希望能够写出类似的东西

template <typename T> void foo() {
    // ...
    if (is_nice<T>::value) {
        bar_which_is_defined_only_for_nice_types<T>();
    }
}

但是,当我尝试编译它(g ++ 4.9.3,没有优化)时,我收到了关于bar_which_is_defined_only_for_nice_types的抱怨。如何在不诉诸 2 个foo()定义的情况下达到预期的效果?

您可以根据is_nice<T>标记调度

#include <type_traits>
template<typename T>
struct is_nice : std::false_type {};
template<>
struct is_nice<int> : std::true_type {};
template<typename T>
void do_nice_things(std::true_type)
{
    bar_which_is_defined_only_for_nice_types<T>();
}
template<typename T>
void do_nice_things(std::false_type)
{
}
template <typename T>
void foo()
{
    do_nice_things<T>(is_nice<T>{});
}