模板中的未知返回类型

Mr *_* M. 5 c++ templates c++11

我有一个功能

template <typename T1, typename T2>
/*return type*/ foo(MyClass<T1>& bar1, MyClass<T2>& bar2)
{
    if (something)
        return bar1;
    else
        return bar2;
}
Run Code Online (Sandbox Code Playgroud)

问题是,我不知道这个函数会返回什么:它可以是MyClass<T1>或者MyClass<T2>.

我怎样才能让它发挥作用?

T1和T2是3个整数的结构,在编译时已知.返回类型取决于那些中较小的2:例如,对于T1 = <5, 1, 1> T2 = <4, 4, 7>返回类型应该是MyClass<T2>.

用法示例:

MyClass<5, 2, 8> m1;
MyClass<4, 2, 1> m2;
cout << foo(m1, m2); //should print m2 (I have a method used for that)
Run Code Online (Sandbox Code Playgroud)

Ant*_*vin 2

您可以定义两个函数,对于给定类型仅实例化一个函数:

template <typename T1, typename T2>
struct ChooseFirst;

template <int A1, int B1, int C1, int A2, int B2, int C2>
struct ChooseFirst<MyClass<A1, B1, C1>, MyClass<A2, B2, C2>> {
    // this requires constexpr make_tuple (C++14)
    static const bool value = std::make_tuple(A1, B1, C1) < std::make_tuple(A2, B2, C2);
    // if in your implementation make_tuple is not constexpr, you can write the comparison manually:
    // static const bool value = A1 < A2 || (A1 == A2 && (B1 < B2 || (B1 == B2 && C1 < C2)));
};

template <typename T1, typename T2>
typename std::enable_if<ChooseFirst<T1, T2>::value, T1&>::type foo(T1& bar1, T2&) {
    return bar1;
}

template <typename T1, typename T2>
typename std::enable_if<!ChooseFirst<T1, T2>::value, T2&>::type foo(T1&, T2& bar2) {
    return bar2;
}
Run Code Online (Sandbox Code Playgroud)

演示