Can the equivalent of an operator bool cast be provided outside of a class definition somehow?
我有一些模板化的C++ 03代码,其中包含一个片段,我想编写这样的代码:
1 2 3 4 5 6 | template <typeName optType> std::string example(optType &origVal) { return bool(origVal) ?"enabled" :"disabled"; } |
但是,没有为
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | template <typename optType> bool castBool(const optType &value) { return bool(value); } template <> bool castBool<struct linger>(const struct linger &value) { return bool(value.l_onoff); } template <typeName optType> std::string example(optType &origVal) { return castBool(origVal) ?"enabled" :"disabled"; } |
但是,我想知道是否有一种更简洁的方法来做到这一点?例如,我可以在类外部定义一个静态
1 2 3 4 5 | bool operator==(const struct linger &lhs, const struct linger &rhs) { return lhs.l_onoff == rhs.l_onoff && lhs.l_linger == rhs.l_linger; } |
所以,也许有一些语法可以告诉编译器如何将一个结构(如EDOCX1[1])提升为bool?
您可以在命名空间中提供一些默认版本:
1 2 3 4 5 6 7 8 9 10 | namespace detail { template <typename T> bool to_bool(const T& val) { return static_cast<bool>(val); } } template <typename T> bool conv_bool(const T& val) { using namespace detail; return to_bool(val); } |
然后,借助ADL的魔力,您可以在所需类的名称空间中提供
1 2 3 4 5 6 7 | namespace whatever { struct linger { ... }; bool to_bool(const linger& value) { return value.l_onoff; } } |
然后到处使用
1 2 3 4 5 6 | template <typeName optType> std::string example(optType &origVal) { return conv_bool(origVal) ?"enabled" :"disabled"; } |
如果您提供自己的
由于
1 2 3 4 5 6 7 | class Boolable : public optType{ public: using optType::optType; operator bool() const{ //your code her } }; |