【发布时间】:2011-08-25 08:54:30
【问题描述】:
大家好。
我正在使用 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;
}
所以问题(具体)如下:myU * myBase 使用operator * (U, const Base &) 并返回Base 类型,到目前为止一切正常。而myU * myDerived 坚持使用广义U::operator * (Y) 并因此返回Q,这不好,因为我又想要Base。
现在,除了Base 和Derived 之外的所有类都是boost 库类,所以我不能修改U 的成员。我如何“击败”U::operator * (Y) 进行重载/模板推导/实例化,在这种情况下,以优雅且“一劳永逸”的方式解决。
我正在使用 MSVC++ 2008,以防它与任何人相关。
编辑:在答案中添加了一个可能(很可能)的解决方案
【问题讨论】:
-
+1 用于小型、独立的示例代码。 :)
-
想到了什么:Boost
U类在操作符上使用 SFINAE 吗? -
你刚刚了解到不幸的是继承和模板不能很好地混合:/
-
@Matthieu:这绝对不是真的。它们混合得很好,因为它们解决了正交问题。编译时元编程和运行时多态性的组合可以构建出色的代码。
-
@Alexandre C:我同意,您可以解决很大的问题,但是在不同的重载中使用基类和模板参数并让它们按照您的意愿行事可能会导致很多麻烦。当然有解决方案,但肯定不像人们想象的那么直接,因为方法的正交性:) 我认为我解决了这个问题没有太多问题,但是,它确实花了 OP 几天的时间来计算出最小的例子:/
标签: c++ templates inheritance operator-overloading