如何在不实例化类型的情况下确定两种c ++类型?

时间:2012-08-20 09:16:23

标签: c++ templates metaprogramming

我有以下问题:

我想确定两种类型之间没有实际评估'结果'类型 - 因为类型可能根本不存在 - 无效。 (请不要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;
}

能以某种方式确定吗? (假设所选类型始终有效,但未选择的类型可能无效)。

2 个答案:

答案 0 :(得分: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;
};

Live example (C++11).对于C ++ 03,需要进行简单的重写以消除使用别名,see here

答案 1 :(得分: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;
}