4

私は次の問題を抱えています:

「結果の」タイプを実際に評価せずに、2つのタイプを判別したいのですが、タイプがまったく存在しない可能性があるため、無効です。(C ++ 11のものは使用しないでください)

例:

 #include <iostream>
 #include <iterator>

template <bool B, typename T, typename F>
struct TemplateIf {
};

template <typename T, typename F>
struct TemplateIf<true, T, F> {
   typedef T Result;
};

template <typename T, typename F>
struct TemplateIf<false, T, F> {
 typedef F Result;
};


int main(int argc, char** argv)
{

// On GCC this is error as std::iterator_traits<int>::value_type doesn't exist 
typename TemplateIf<true, int, std::iterator_traits<int>::value_type >::Result a;
a = 5;

std::cout << a << std::endl;

 return 0;
}

どういうわけか決定できますか?(選択されたタイプは常に有効であると想定しますが、選択されていないタイプは無効である可能性があります)。

4

2 に答える 2

4

遅延評価を使用する:

template<class T>
using Apply = typename T::type;

template<class T>
struct identity{ using type = T; };

template<bool B, class T, class F>
struct lazy_if{ using type = Apply<T>; };

template<class T, class F>
struct lazy_if<false, T, F> : lazy_if<true, F, T>{};

template<class T>
struct lazy_iterator_value_type{
  using type = typename std::iterator_traits<T>::value_type;
};

実例(C ++ 11)。C ++ 03の場合、using-aliasesを取り除くための簡単な書き直しが必要です。ここを参照してください

于 2012-08-20T09:43:24.250 に答える
4

タイプを直接渡す代わりに、タイプに評価されるメタ関数を渡します。このメタ関数は、if内で遅延評価できます。

#include <iostream>
#include <iterator>

template <bool B, typename T, typename F>
struct TemplateIf {};

template <typename T, typename F>
struct TemplateIf<true, T, F> {
    typedef typename T::type Result;
};

template <typename T, typename F>
struct TemplateIf<false, T, F> {
    typedef typename F::type Result;
};

template <typename T>
struct get_value_type {
    typedef typename std::iterator_traits<T>::value_type type;
};

template <typename T>
struct identity {
    typedef T type;
};

int main(int argc, char** argv)
{
    TemplateIf<true, identity<int>, get_value_type<int> >::Result a;
    a = 5;
    std::cout << a << std::endl;
    return 0;
}
于 2012-08-20T09:44:42.720 に答える