獲取最大可用類型
回答
嗯,這取決於你需要這個有多嚴重,你可以嘗試這裏的一些嚴重metaprograming ...
首先,你顯然需要某種形式的「包裝」定義所有可用的基本類型的,所以這裏是:
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;
然後你需要一種方法來此類型對於大小排序,所以,首先,讓我們確定能夠實現的大小一個STRIC弱順序一元函數:
template<typename L, typename R>
class smaller
{
public:
static const bool value = sizeof(L) < sizeof(R);
};
現在,排序算法。在這裏,我任意選擇了合併排序,這需要3個其他元函數:pack_cat用於連接包,合併用於根據順序合併它們,並且在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機器:
MATCH!
這是什麼。謝謝。 – smallB
我想你可以寫一個小程序來重新處理你的主程序。 小程序可以使用sizeof()比較所有數字類型來確定最大值。然後,將主程序中的符號「LARGEST」替換爲實際最大的類型。
您可以使用std::numeric_limits模板類獲取有關具有特化的原始類型的一些信息。
這並不是說在某些編譯器一個long double
比long long
較大雖然上他人long double
是double
(MSVC)的大小。
對於整數類型而已,你可以使用<cstdint>
頭,它可以讓你做:
std::intmax_t largest;
我不知道有任何這樣的功能,包括浮點類型,雖然。
- 1. 從可變類型列表中獲取最大類型
- 2. 獲取DateTime類型的最大方法
- 3. 在CoreCLR中獲取可用類型
- 4. 獲取最大的無符號整數類型
- 5. 如何獲取c中給定數據類型的最大值?
- 6. 數據表 - 從字符串類型列獲取最大(日)
- 7. 如何查詢從varchar類型獲取最大ID?
- 8. jQuery:從類中獲取最大數字
- 9. 可可SCNetworkInterface獲取媒體子類型
- 10. 可可:獲取Mime類型的網址?
- 11. 獲取數據類型字節大小
- 12. 獲取最新x帖子的類型
- 13. 獲取「最具體」的輸入類型
- 14. 獲取類型的類型
- 15. 獲取泛型類類型
- 16. 獲取類型
- 17. 獲取最高AVCaptureSessionPreset可用
- 18. 是否可以獲取泛型類型的類型名稱?
- 19. 我們可以使用metaprograming在工會中獲得最大(sizeof)類型嗎?
- 20. MySQL的最小/最大爲DOUBLE類型
- 21. 可能在c#中獲取別名類型的類型?
- 22. 獲取動態類型的類類型?
- 23. 獲取泛型類的類的類型?
- 24. MediaPlayer獲取最大能力
- 25. 獲取最大價值
- 26. PDO獲取最大值
- 27. php simplexml獲取最大值
- 28. CouchDB中獲取最大值
- 29. 從NSMutableArray獲取最大值
- 30. 獲取最大的地圖
您是指最大的原始類型?那麼'int [100000]'呢?這是一個非常大的類型,這算不算?而且,當然,這是爲了什麼? – jalf
@jalf是的,我的意思是最大的原始類型可用 – smallB