2016-02-08 53 views
0

我所描述的轉換不明確。標準隱式轉換不可能選擇投運營商

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; 

cpp.sh

運行的代碼我知道一些方法來解決這個問題:

1.新增類型轉換操作符所有預期的類型。

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

這看起來像不好的做法。

2.use template with restricted types

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.Hold booldbl_值,因爲只有其中之一被使用。不酷,至於我。

可能存在更精細的解決方案嗎?像

operator bool() const no_implicit_conversation_to_other_types_specifier { return boo_; } 

這個問題最多是C++理論。

Upd。 no_implicit_conversation_to_other_types_specifier是explicit

explicit operator bool() const { return boo_; } 

Run

回答

3

使所有的轉換操作符明確(防止隱式轉換),將是一個良好的開端:

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

我不肯定,但我想這將有助於防止過於含糊。

+0

很酷。 'no_implicit_conversation_to_other_types_specifier'是'explicit') – kyb

+0

所以。爲了讓我想要的'explicit'應該只在'operator bool()'之前被添加。它的作品http://cpp.sh/4l4iv – kyb

+0

@kyb:很高興聽到它。隱式轉換是魔鬼的工作,這就是爲什麼! –