我有以下问题:
我想确定两种类型之间没有实际评估'结果'类型 - 因为类型可能根本不存在 - 无效。 (请不要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;
}
能以某种方式确定吗? (假设所选类型始终有效,但未选择的类型可能无效)。
答案 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;
}