sizeof
が他より大きいタイプを返すクラステンプレートを作成するにはどうすればよいですか。例:タイプのリストで最大のタイプを返すにはどうすればよいですか?
typename largest<int, char, double>::type;
これは、double
を返します。それをどうやってやりますか?
sizeof
が他より大きいタイプを返すクラステンプレートを作成するにはどうすればよいですか。例:タイプのリストで最大のタイプを返すにはどうすればよいですか?
typename largest<int, char, double>::type;
これは、double
を返します。それをどうやってやりますか?
あなたは可変長テンプレート引数とコンパイル時に条件文を使用して、これを達成することができます
#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, "");
}
はここで最大のタイプを選択しますバージョンだが、最後のタイプの賛成で絆を壊す:
ここで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{});
}
クラスの型が最大ですが、デフォルトのコンストラクタがない場合はどうなりますか? – 0x499602D2
@ 0x499602D2:次に、この例は機能しませんが、テンプレートはそのままです。 –
イェーイ、私はTHIのこつを取得し始めていると思います何かのもの。 +1。 – chris