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;
運行的代碼我知道一些方法來解決這個問題:
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 bool
在dbl_
值,因爲只有其中之一被使用。不酷,至於我。
可能存在更精細的解決方案嗎?像
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。
很酷。 'no_implicit_conversation_to_other_types_specifier'是'explicit') – kyb
所以。爲了讓我想要的'explicit'應該只在'operator bool()'之前被添加。它的作品http://cpp.sh/4l4iv – kyb
@kyb:很高興聽到它。隱式轉換是魔鬼的工作,這就是爲什麼! –