27

sizeof他の型よりも大きい型を返すクラス テンプレートを作成するにはどうすればよいでしょうか。例えば:

typename largest<int, char, double>::type;

それは返されるはずdoubleです。どうすればそれを行うことができますか?

4

2 に答える 2

29

これは、可変個引数のテンプレート引数とコンパイル時の条件を使用して実現できます。

#include <type_traits>

template <typename... Ts>
struct largest_type;

template <typename T>
struct largest_type<T>
{
    using type = T;
};

template <typename T, typename U, typename... Ts>
struct largest_type<T, U, Ts...>
{
    using type = typename largest_type<typename std::conditional<
            (sizeof(U) <= sizeof(T)), T, U
        >::type, Ts...
    >::type;
};

int main()
{
    static_assert(
        std::is_same<largest_type<int, char, double>::type, double>::value, "");
}
于 2013-05-29T00:57:07.497 に答える
8

これは、最大のタイプを選択するバージョンですが、最後のタイプを優先して関係を壊します:

template<bool, typename, typename>
struct pick_type;
template<typename T, typename U>
struct pick_type<true,T,U> {
    typedef T type;
};
template<typename T, typename U>
struct pick_type<false,T,U> {
    typedef U type;
};

template<typename...>
struct largest;
template<typename T>
struct largest<T> {
    typedef T type;
};
template<typename T, typename... U>
struct largest<T, U...> {
    typedef typename largest<U...>::type tailtype;
    typedef typename pick_type<
            (sizeof(T)>sizeof(tailtype)),
            T,
            tailtype
            >::type type;
};

コード例は次のとおりです。

#include <iostream>
using namespace std;

void foo( double ) { cout << "double\n"; }
void foo( int ) { cout << "int\n"; }
void foo( char ) { cout << "char\n"; }
void foo( bool ) { cout << "bool\n"; }
void foo( float ) { cout << "float\n"; }


int main() {
    foo(largest<int,double,char,bool,float>::type{});
}
于 2013-05-29T01:07:18.113 に答える