我有一些模板化的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?
答案 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
}
};