转换含糊不清。标准隐式转换无法选择强制转换运算符

时间:2016-02-08 17:24:21

标签: c++ templates casting

我有一个描述为

的自定义类型
struct A {
    double dbl_;
    bool boo_;
    operator double() const { return dbl_; }
    //operator bool() const { return boo_; }
};

现在我想将其转换为简单类型。当operator bool()未定义时a可以隐式转换为任何简单类型int,unsigned,float等。但operator bool()转换不明确。

A a;
cout << (double) a << endl;
cout << (float) a << endl; //error: conversion from 'A' to 'float' is ambiguous; candidates are: A::operator bool() const; A::operator double() const
cout << (int) a << endl;  // the same
cout << (char) a << endl; // the same
return 0;

https://jsfiddle.net/6bh0d9yo/1/

上的可运行代码

我知道一些解决方法:

1.add类型转换运算符所有预期类型。

 operator int() const { return (int)dbl_; }
 // and so on...

这看起来很糟糕。

2.使用 cpp.sh

template<class T, class...> struct is_any_of: std::false_type{};
template<class T, class Head, class... Tail>
struct is_any_of<T, Head, Tail...> : std::conditional<
        std::is_same<T, Head>::value,
        std::true_type,
        is_any_of<T, Tail...> >::type
{};

template<
        class T,
        class = typename std::enable_if<is_any_of<T, int, float, unsigned, double>::value>::type
>
operator T() const {
    if(type_ != Type::NUMBER) throw Node::Exception("not is number");
    return dbl_;
}

3. bool中的dbl_值,因为只使用其中一个值。对我来说并不酷。

可能存在更精细的解决方案?像

operator bool() const no_implicit_conversation_to_other_types_specifier { return boo_; }

问题至多是C ++的理论。

更新。 no_implicit_conversation_to_other_types_specifier为explicit

explicit operator bool() const { return boo_; }

template with restricted types

1 个答案:

答案 0 :(得分:3)

让所有转换运算符显式(以防止隐式转换)将是一个良好的开端:

struct A {
    double dbl_;
    bool boo_;
    explicit operator double() const { return dbl_; }
    explicit operator bool() const { return boo_; }
};

我不是肯定,但我想这也有助于防止歧义。