gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:28:46 27 4
gpt4 key购买 nike

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

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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com