3

最初の引数が定義されている場合は最初の引数タイプを選択し、そうでない場合は2番目の引数タイプを選択するテンプレート式が必要です。

select<int, float>::type               // type evaluates to int
select<an_undefined_type, float>::type // type evaluates to float

...そしてソリューションはC++03とBoost1.33.1で動作する必要があります:(

私の目標は、関数テンプレートパラメータintとしてとの両方を受け入れることです。そのため、次のようなことができます。boost::optional<int>T

template<typename T>
void fn(T& t)
{
    int x = std::numeric_limits<select<T::value_type, T>::type>::digits;
}

boost::optional<int>::value_typeが定義されているので。

C++11ソリューションも高く評価されています。

タイプではなく概念に特化しようとしているので、テンプレートの特殊化でこれを行う方法がわかりません。基本的に、コンセプトに一致する1つのany_integerスペシャライゼーションと、コンセプトに一致する1つのスペシャライゼーションが必要になりboost::optional<any_integer>ます。

C ++ 11を使用すると、次の方法でこの特定の目標を達成できると思います。

std::conditional<std::is_integral<T>::value, T, T::value_type>::value

しかし、私はC ++ 11を持っていないので、より一般的な解決策が必要です。

4

1 に答える 1

2

私はあなたがあなたが探している正確な表記法を達成することができないと思います。ただし、意味的に目的を達成するために、わずかに異なる表記法を使用できると思います。現在の表記法の問題

int x = std::numeric_limits<select<T::value_type, T>::type>::digits;

つまりselect<T0, T1>、2つの型が必要です。つまり、型が存在するための要件は、select<T0, T1>テンプレートではなく、それを呼び出す関数にあります。これを変更する方法は、

int x = std::numeric_limits<select<typename get_value_type<T>::type, T>::type>::digits;

ここで必要なget_value_type<T>のは、ネストされたタイプが存在する場合はそれを生成し、select<T0, T1>そこに到着した場合は無視するタイプvoid(またはカスタムマーカータイプ)を作成することだけです。get_value_type<T>テンプレートはかなり単純なはずです(Dirk Holsoppleの答えを見ました、機能させることができませんでした):

template <typename T>
struct has_value_type
{
    typedef char (&true_type)[1];
    typedef char (&false_type)[2];
    template <typename D> static true_type test(typename D::value_type*);
    template <typename D> static false_type test(...);

    enum { value = sizeof(test<T>(0)) == 1 };
};

template <typename T, bool = has_value_type<T>::value >
struct get_value_type
{
    typedef T type; // EDIT
};

template <typename T>
struct get_value_type<T, true>
{
    typedef typename T::value_type type;
};

明らかに、次のようなものを使用できるように、タイプ特性を少し異なるものとして定義することをお勧めします。

int x = std::numeric_limits<typename get_type<T>::type>::digits;

これは、が存在する場合はネストされた型を返し、そうでない場合は型を返しvalue_typeますT

于 2012-11-10T13:50:47.297 に答える