EdF*_*EdF 7 c++ inheritance templates operator-overloading
问候所有.
我正在使用Boost Units库编写一些代码并遇到了问题.
我已经设法从Boost代码中抽象出问题所以你不会看到大量的boost模板元编程.虽然我确定你是否有经验,但它可以提供帮助.这是复制品:
class Base{};
class Derived : public Base
{
public:
Derived(){}
Derived(const Base &){}
};
class Q {};
class U
{
public:
template< typename Y >
Q operator * (Y)
{
Q r;
return r;
}
};
Base operator * (U, const Base &)
{
Base r;
return r;
}
int main(int argc, char **argv)
{
Base myBase;
U myU;
Base myOtherBase = myU * myBase;
Derived myDerived;
Derived myOtherDerived = myU * myDerived;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
所以问题(具体)如下:myU * myBase
使用operator * (U, const Base &)
和返回类型Base
,到目前为止都是好的.而myU * myDerived
坚持使用普遍U::operator * (Y)
,因此返回Q
,没有好,因为我想一个Base
试.
现在,除了Base
和之外的所有类Derived
都是提升库类,所以我无法修改U的成员.我如何"击败" U::operator * (Y)
过载/模板演绎/实例化,在这种情况下,以优雅和"一劳永逸"的方式.
我正在使用MSVC++ 2008,以防它与任何人相关.
编辑:在答案中添加了一个可能的(很可能)解决方案
正当我昨晚放弃尝试解决这个问题时,答案却像一块砖头一样击中了我。的Q
类型化结果在概念上与的类型化结果U::operator*(Base)
相同,即使它们由不同的类型表示。我需要做的就是提供一个接受类型 Q 的构造函数。Base
operator*(U,Base)
Base ( const Q & )
class Base
{
public:
Base(){}
Base(const Q &){}
};
Run Code Online (Sandbox Code Playgroud)
这使得我的示例可以编译。现在看看我是否真的可以在真实版本中编写所需的构造函数(其中 aBase
实际上是 aBase<Q,...>
并且Q
我们接受的是 a Q<Base,...>
)。
不幸的是,提出问题的简化抽象示例使得发现这个解决方案变得更加困难,所以我有很大的优势。感谢所有提出想法/评论和答案的人。