如何实现一个支持不同类型的 max/min 函数?

有个需求,能否做到实现一个类似这样的函数:

template <typename T1, typename T2>
XXX Min(T1 t1, T2 t2)
{
    return (t1 < t2 ? t1 : t2);
}

其中 XXX 是我们要推导出的类型。

以下是一个失败的尝试。

我记得 Loki 里有关于如何判断某个类型能否隐式转换为另一个类型的东西,大意如下:

template <typename T, typename U>
class Conversion
{
private:
    typedef char Small;
    class Big { char XXX[2]; };
    static Small Test(U);
    static Big Test(...);
    static T MakeT();
public:
    enum
    {
        Exists = (sizeof(Test(MakeT())) == sizeof(Small)),
    };
};

如此,Conversion<T, U>::Exists 就能判断 T 到 U 的转换是否存在了。

然后再搞个选择:

template <bool Condition, typename TypeIfTrue, typename TypeIfFalse>
struct Select
{
    typedef TypeIfFalse Type;
};

template <typename TypeIfTrue, typename TypeIfFalse>
struct Select<true, TypeIfTrue, TypeIfFalse>
{
    typedef TypeIfTrue Type;
};

最后,再来个:

struct NullType;

template <typename T, typename U>
struct CommonType
{
    typedef typename Select<Conversion<T, U>::exists,
                                        U,
                                        typename Select<Conversion<U, T>::exists,
                                                                T,
                                                                NullType>::Type
                                       >::Type Type;
};

那么 CommonType<T1, T2> 就是 T1 和 T2 之间哪个是他们的共有类型了。

测试:

int main()
{
    CommonType<int, double>::Type m = 0;

    return 0;
}

调试,确认 m 是 double 的。但是反过来写 CommonType<double, int>::Type m = 0;,m 却是 int 的。

这说明这套机制一开始就有问题,Test(U) 和 Test(…) 两个重载函数中,Test(…) 不会在需要 double 转 int 时胜出。这是第一个问题。

第二个问题,当写下如下代码的时候:

template <typename T1, typename T2>
CommonType<T1, T2>::Type Min(T1 t1, T2 t2)
{
    return (t1 < t2 ? t1 : t2);
}

编译无法通过。原因是返回类型中的 CommonType 中的模板参数 T、U 无法接受此时还不能确定的 T1、T2。

(更正:不是这个原因,返回类型前加 typename 即可。现在问题还是第一个问题。)

请教各位,有没有什么方法做到?欢迎指教~

C++ 0x 中就能很方便做到了:

template <typename T1, typename T2>
auto Min(T1 t1, T2 t2) -> decltype(t1 + t2)
{
    return (t1 < t2 ? t1 : t2);
}

int main()
{
    int a = 2;
    double b = 1.0;
    auto m = Min(a, b);

    return 0;
}

原文链接: https://www.cnblogs.com/Streamlet/archive/2011/03/29/17033456.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    如何实现一个支持不同类型的 max/min 函数?

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/23045

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午1:01
下一篇 2023年2月8日 上午1:01

相关推荐