可以以某种方式在类定义之外提供运算符bool强制转换的等价物吗?

时间:2015-07-12 17:10:40

标签: c++ templates casting c++03 typecast-operator

我有一些模板化的C ++ - 03代码,其中包含一个我想编写的代码片段:

template <typeName optType>
std::string
example(optType &origVal)
{
  return bool(origVal) ? "enabled" : "disabled";
}

但是,optType::operator bool()没有定义struct linger,我无法添加struct,因为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}}。因此,就目前而言,我已将其写成:

operator==()

但是,我想知道是否有更简洁的方法来做到这一点?例如,我可以在类之外定义静态bool operator==(const struct linger &lhs, const struct linger &rhs) { return lhs.l_onoff == rhs.l_onoff && lhs.l_linger == rhs.l_linger; } ,例如:

struct linger

所以也许有一些语法告诉编译器如何在这里将private ZBarScannerView mScannerView; @Override public void onCreate(Bundle state) { super.onCreate(state); mScannerView = new ZBarScannerView(this); ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, (int) getResources().getDimension(R.dimen.scanner_height)); mScannerView.setLayoutParams(params); setContentView(mScannerView); } 这样的结构提升为bool?

2 个答案:

答案 0 :(得分:2)

您可以在命名空间中提供一些默认版本:

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的魔力,你可以在你想要的类的命名空间中提供to_bool的版本:

namespace whatever {
    struct linger { ... };

    bool to_bool(const linger& value) {
        return value.l_onoff;
    }
}

然后在任何地方使用conv_bool

template <typeName optType>
std::string
example(optType &origVal)
{
  return conv_bool(origVal) ? "enabled" : "disabled";
}

如果您提供了自己的to_bool()功能,那么这将是首选。否则,将调用默认值,它将尝试执行operator bool或某些等效操作。无需处理模板问题。

答案 1 :(得分:0)

因为operator bool只能是一个方法,而不是一个独立的函数,我认为其中一个解决方案是从你想要转换为bool的类生成派生类,并在那里只实现你的运算符。除非我们讨论的课程是final,否则这将有效。

class Boolable : public optType{
public:
    using optType::optType;
    operator bool() const{
        //your code her
    }
};