4

我有以下问题:

我想在不实际评估“结果”类型的情况下确定两种类型 - 因为该类型可能根本不存在 - 是无效的。(请不要使用 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,需要进行简单的重写以摆脱使用别名,请参见此处

于 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 回答