c++ - 获取可用的最大类型

标签 c++ metaprogramming

如何在我的编译器中获取最大可用类型的名称?有可能吗?
像这样的东西:

auto largest = get_largest_type();  

在我的例子中,auto 将是 long long。

最佳答案

好吧,取决于你有多需要这个,你可以在这里尝试一些严肃的元编程......

首先,您显然需要某种定义所有可用原始类型的“包”,因此它是:

template<typename... TYPES>
class pack
{};

typedef pack<float, double, long double, unsigned short, unsigned int,
    unsigned long, unsigned long long, short, int, long, long long> primitive_types;

然后您将需要一种根据大小对这些类型进行排序的方法,因此首先,让我们定义一个能够对大小实现严格弱排序的元函数:

template<typename L, typename R>
class smaller
{
    public:
        static const bool value = sizeof(L) < sizeof(R);
};

现在,排序算法。这里我任意选择了合并排序,它需要 3 个其他元函数:pack_cat 用于连接包,pack_merge 用于根据顺序合并它们,以及 halve 用于在另外 2 个包中拆包。

template<typename, typename>
class pack_cat;

template<typename... L, typename... R>
class pack_cat<pack<L...>, pack<R...>>
{
    public:
        typedef pack<L..., R...> type;
};

template<template<typename, typename> class, typename, typename>
class pack_merge;

template<template<typename, typename> class MF, typename HL, typename... TL, typename HR, typename... TR>
class pack_merge<MF, pack<HL, TL...>, pack<HR, TR...>>
{
    public:
        typedef typename std::conditional<MF<HR, HL>::value,
                typename pack_cat<pack<HR>, typename pack_merge<MF, pack<HL, TL...>, pack<TR...>>::type>::type,
                typename pack_cat<pack<HL>, typename pack_merge<MF, pack<TL...>, pack<HR, TR...>>::type>::type>::type type;
};

template<template<typename, typename> class MF, typename H, typename... T>
class pack_merge<MF, pack<H, T...>, pack<>>
{
    public:
        typedef pack<H, T...> type;
};

template<template<typename, typename> class MF, typename... R>
class pack_merge<MF, pack<>, pack<R...>>
{
    public:
        typedef pack<R...> type;
};

template<typename>
class halve;

template<typename A, typename B, typename... T>
class halve<pack<A, B, T...>>
{
    public:
        typedef typename pack_cat<pack<A>, typename halve<pack<T...>>::L>::type L;
        typedef typename pack_cat<pack<B>, typename halve<pack<T...>>::R>::type R;
};

template<typename T>
class halve<pack<T>>
{
    public:
        typedef pack<T> L;
        typedef pack<> R;
};

template<>
class halve<pack<>>
{
    public:
        typedef pack<> L;
        typedef pack<> R;
};

template<template<typename, typename> class MF, typename P>
class pack_sort
{
    private:
        typedef typename halve<P>::L L;
        typedef typename halve<P>::R R;

    public:
        typedef typename pack_merge<MF, typename pack_sort<MF, L>::type, typename pack_sort<MF, R>::type>::type type;
};

template<template<typename, typename> class MF, typename H>
class pack_sort<MF, pack<H>>
{
    public:
        typedef pack<H> type;
};

template<template<typename, typename> class MF>
class pack_sort<MF, pack<>>
{
    public:
        typedef pack<> type;
};

最后,您将需要一个元函数来检索包的最后一个参数,这很容易实现:

template<typename>
class pack_get_last;

template<typename H, typename... T>
class pack_get_last<pack<H, T...>>
{
    public:
        typedef typename pack_get_last<pack<T...>>::type type;

};

template<typename H>
class pack_get_last<pack<H>>
{
    public:
        typedef H type;
};

现在,一个测试程序可以证明我在那里写的所有这些垃圾代码确实有效:

#include <iostream>
#include <utility>

/* all those metafunctions come here */

int main()
{
    typename pack_get_last<typename pack_sort<smaller, primitive_types>::type>::type largest;

    if(std::is_same<decltype(largest), long double>::value)
        std::cout << "MATCH!\n";
}

在使用 gcc 4.6 的 x64 Linux 机器中输出,其中 long double 是最大的可用简单原始类型:

MATCH!

关于c++ - 获取可用的最大类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6403224/

相关文章:

javascript - 如何延迟脚本标签直到其他脚本标签运行

c++ - excel xll :name of the calling function from within function

c++ - 释放内存opencv

通过函数的 Python 对象

function - 动态定义LUA函数的正确方法

python - 给定一个方法,如何在 Python 3.3 及更高版本中返回它所属的类?

java - 是否可以在 Java 中加载同名的两个不同类之一?

c++ - 在链表中查找损坏

c++ - C和C++的静态变量之间的区别?

c++ - C++ 中的 const 和静态说明符