c++模板编程中的Or语句

Or statement in C++ template programming

本文关键字:Or 语句 编程 c++      更新时间:2023-10-16

我有一个大致像这样的程序。

#include <iostream>
#include <type_traits>
class Output
{
public:
    template <typename T>
    Output& operator&(T const& t)
    {
        std::cout << t << std::endl;
        return *this;
    }
};
class Input
{
public:
    template <typename T>
    Input& operator&(T& t)
    {
        std::cin >> t;
        return *this;
    }
};
class C
{
    public:
        int num1, num2;
};
template <typename T>
typename std::enable_if<std::is_same<T, Input>::value>::type operator&(T& t, C& c)
{
    t & c.num1 & c.num2;
}
template <typename T>
typename std::enable_if<std::is_same<T, Output>::value>::type operator&(T& t, C& c)
{
    t & c.num1 & c.num2;
}
int main()
{
    Output o;
    Input i;
    C c;
    i & c;
    o & c;
    return 0;
}

它工作得很好,但我理想地想结合功能typename std::enable_if<std::is_same<T, Input>::value>::type operator&(T& t, C& c)typename std::enable_if<std::is_same<T, Output>::value>::type operator&(T& t, C& c)。所以我在寻找类似typename std::enable_if<std::is_same<T, Input>::value || std::is_same<T, Output>::value>>::type operator&(T& t, C& c)的东西。c++模板提供这样的"或"语句吗?

答案真的很简单-使用|| -正是你在你的问题。enable_if的第一个参数是bool,因此可以使用产生编译时布尔值的任何表达式组合。

template <typename T>
typename std::enable_if<
    std::is_same<T, Input>::value ||
    std::is_same<T, Output>::value
>::type operator&(T& t, C& c)
{
    t & c.num1 & c.num2;
}

现场演示