C++ 将运算符类型强制转换为除某些引用以外的任何算术类型

C++ 将运算符类型强制转换为除某些引用以外的任何算术类型,c++,casting,operator-overloading,C++,Casting,Operator Overloading,假设我们有这样一个示例类: class Union { union Value { int i; float f; }; enum class Type { Int, Float }; Type type; Value value; public: operator int&() { return value.i; } operator float&() { retu

假设我们有这样一个示例类:

class Union {
    union Value {
        int i;
        float f;
    };
    enum class Type {
        Int, Float
    };
    Type type;
    Value value;

public:
    operator int&() { return value.i; }
    operator float&() { return value.f; }

    template <typename T, is_arithmetic<T>>
    operator T() const {
        if (type == Type::Int)
            return static_cast<T>(value.i);
        else
            return static_cast<T>(value.f);
    }
}
类联合{
联合价值{
int i;
浮动f;
};
枚举类类型{
整数,浮点
};
类型;
价值观;
公众:
运算符int&({返回值.i;}
运算符float&({return value.f;}
模板
运算符T()常量{
if(type==type::Int)
返回静态_cast(值i);
其他的
返回静态_cast(值f);
}
}

我想允许将联合实例强制转换为任何算术类型,但禁止强制转换为引用,示例中的int和float类型除外。对于给定的示例,编译器会通知现有的多个转换。如何处理这样的问题?甚至可能吗?

问题是
是算术问题。它不像你想象的那样。这是一个模板非类型参数
是一个类,一种类型

你可以这样想:

template <class T, int N>
struct X {};
我的意见是,您不需要确保
t
是一种算术类型,因为
static\u cast
可以为您这样做

如果您想在声明中强制执行,则需要SFINAE和
启用\u If
,直到我们有了以下概念:

template <class T, class Enable = std::enable_if_t<std::is_arithmetic<T>::value>>
operator T() const {
模板
运算符T()常量{


我对您的设计也有一些顾虑。隐式强制转换作为经验法则是不好的。因此,您至少可以将其显式化。

我提出了一个解决方案,如实现给定的运算符:

operator int&();
operator float&();
operator T();
operator T() const;

有了这组运算符,我可以像预期的那样定义算术变量,即非常量、常量、常量引用和特定类型(如int和float)的额外引用。

我编写is_算术的方式更像是伪代码,不会用不必要的代码填充示例。我将在回答中给出我制定的解决方案。但我应用了感谢您对模板的解释。
template <class T, class Enable = std::enable_if_t<std::is_arithmetic<T>::value>>
operator T() const {
operator int&();
operator float&();
operator T();
operator T() const;