如何否定 std::enable_if

另请参见std::enable_if 最小示例std::enable_if 和 std::is_floating_point 最小示例

由于 std::enable_if 的模板参数是布尔值,你可以使用 ! 运算符轻松否定它。

示例:

enable_if_negation_example.cpp
// 此函数使用普通(非否定)的 std::enable_if:
template<typename T, typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr>
T mySineFloatingPointOnly(T arg) {
    return sin(arg);
}

// 此函数有否定的 std::enable_if:
template<typename T, typename std::enable_if<!std::is_floating_point<T>::value>::type* = nullptr>
T mySineNOFloatingPoint(T arg) {
    return sin(arg);
}

完整示例:

enable_if_negation_full.cpp
#include <iostream>
#include <type_traits>
#include <cmath>

using std::cout;
using std::endl;

template<typename T>
T mySine(T arg) {
    return sin(arg);
}

template<typename T, typename std::enable_if<std::is_floating_point<T>::value>::type* = nullptr>
T mySineFloatingPointOnly(T arg) {
    return sin(arg);
}

template<typename T, typename std::enable_if<!std::is_floating_point<T>::value>::type* = nullptr>
T mySineNOFloatingPoint(T arg) {
    return sin(arg);
}

int main() {
    cout << mySine(1.5) << endl;
    // mySine(1) 将工作
    // mySineFloatingPointOnly(1) 将无法编译
    // mySineNOFloatingPoint(1.5) 将无法编译
    cout << mySineFloatingPointOnly(1.5) << endl;
    cout << mySineNOFloatingPoint(1) << endl;
}

Check out similar posts by category: C/C++