template <class T>
class Foo {
public:
T val;
Foo(T _v): val(_v){}
friend ostream& operator<< (ostream& out, const Foo& A) {
out << A.val;
return out;
}
};
template <class X, class Y> Foo<???> operator+(const Foo<X>& A, const Foo<Y> & B) {
if (sizeof(X) > sizeof (Y))
return Foo<X>(A.val + B.val);
else
return Foo<Y>(A.val + B.val);
}
int main() {
Foo<double> a(1.5);
Foo<int> b(2);
cout << a << endl;
cout << b << endl;
cout << a+b << endl;
}
我的目标是让operator+
函数根据参数的类型返回不同的类型。
例如,如果a
为int
且b为int
,则返回Foo<int>
,如果其中一个或两者为double
,则返回{{ 1}}。
有可能吗?
答案 0 :(得分:4)
(C ++ 11):在dectype中使用declval
表达式:
#include <utility>
template <class X, class Y>
Foo<decltype(std::declval<X>() + std::declval<Y>())> operator+(...);
答案 1 :(得分:3)
这是可能的(在C ++ 03或C ++ 11中)使用部分模板特化。
// C++ does not allow partial specialization of function templates,
// so we're using a class template here.
template <typename X, typename Y, bool xLarger>
struct DoPlusImpl // When x is selected
{
typedef Foo<X> result_type;
};
template <typename X, typename Y>
struct DoPlusImpl<X, Y, false> // When y is selected
{
typedef Foo<Y> result_type;
};
template <typename X, typename Y> // Select X or Y based on their size.
struct DoPlus : public DoPlusImpl<X, Y, (sizeof (X) > sizeof (Y))>
{};
// Use template metafunction "DoPlus" to figure out what the type should be.
// (Note no runtime check of sizes, even in nonoptimized builds!)
template <class X, class Y>
typename DoPlus<X, Y>::result_type operator+(const Foo<X>& A, const Foo<Y> & B) {
return typename DoPlus<X, Y>::result_type
(A.val + B.val);
}
您可以在IDEOne上看到这一点 - &gt; http://ideone.com/5YE3dg
答案 2 :(得分:1)
是的!如果你想给出自己的规则,这就是你的方法:
template <typename X, typename Y> struct Rule {};
template<> struct Rule<int, int> { typedef int type;};
template<> struct Rule<float, int> { typedef bool type;};
然后
template <class X, class Y> Foo<typename Rule<X, Y>::type> operator+(...)