C++ 运算符==()的模板化类的隐式转换
我有一个模板类,如下所示:C++ 运算符==()的模板化类的隐式转换,c++,templates,operator-keyword,implicit-conversion,C++,Templates,Operator Keyword,Implicit Conversion,我有一个模板类,如下所示: struct Base { bool operator==(const Base& other) const { return v == other.v; } int v; }; struct Abc : public Base { void execute() { /*logic1*/ } }; struct Def : public Base { void execute() { /*logic2*
struct Base
{
bool operator==(const Base& other) const {
return v == other.v;
}
int v;
};
struct Abc : public Base
{
void execute() { /*logic1*/ }
};
struct Def : public Base
{
void execute() { /*logic2*/ }
};
template <typename T>
class Foo
{
public:
bool operator==(const Foo& other) const {
return (a == other.a) && (b == other.b);
}
int a;
T b;
};
struct Base
{
布尔运算符==(常数基和其他)常数{
返回v==other.v;
}
INTV;
};
结构Abc:公共基础
{
void execute(){/*logic1*/}
};
结构定义:公共基
{
void execute(){/*logic2*/}
};
模板
福班
{
公众:
布尔运算符==(常量Foo和其他)常量{
返回(a==其他.a)和&(b==其他.b);
}
INTA;
tb;
};
这很好,但是我想扩展这个操作符==()方法,以便仅当传入的对象是相同的模板类型时,等式才有效。下面是一个例子:
Foo<Abc> obj1;
Foo<Abc> obj2;
Foo<Def> obj3;
obj1 == obj2; // should be true
obj1 == obj3; // should fail at compile-time or run-time
Foo-obj1;
Foo-obj2;
Foo-obj3;
obj1==obj2;//应该是真的
obj1==obj3;//应该在编译时或运行时失败
当我这样做时:
bool operator==(const Foo& other) const {
std::cerr << typeid(other).name() << std::endl;
return (a == other.a) && (b == other.b);
}
bool运算符==(常量Foo和其他)常量{
据我所知,存在从Foo
到Foo
的隐式转换
可能的解决办法是:
禁止隐式类型转换(对构造函数和强制转换运算符使用explicit
关键字)
将operator==
设置为模板,并使用enable\u if
仅允许可能的组合:
template <typename T1, typename = std::enable_if<std::is_same<T, T2>::value>::type>
bool operator == (const Foo<T1>& other) const
模板
布尔运算符==(常量Foo和其他)常量
您的运算符只能接受Foo
或派生类。您是否从Foo派生,它是否具有隐式构造函数?问题是什么。“若要仅在传入的对象为相同模板类型时才允许等式有效”。您当前不希望使用的其他类型有哪些?@NeilKirk-没有来自Foo的派生类。目前运算符==()通过隐式转换适用于不同的t类型。我似乎只能选择完全删除运算符==()(以防止隐式转换),或保留它并进行隐式转换。我希望能够比较两个对象,例如Foo和Foo,但在编译时或运行时都无法比较Foo和Foo。@n.m.-它当前允许T的任何其他类型具有相同的成员变量,我希望不允许这样做,因为功能不同。有关更多c的信息,请参阅上面的答复ontext。发布的代码与您的声明不匹配。请给出一个示例,比较Foo
和Foo
,编译器允许。谢谢,第二个选项看起来是可行的。您能否给出第一个选项对该用例有何帮助的示例?请按照注释中的要求提供更多的代码。