【发布时间】:2012-08-20 09:16:23
【问题描述】:
我有以下问题:
我想在不实际评估“结果”类型的情况下确定两种类型 - 因为该类型可能根本不存在 - 是无效的。 (请不要使用 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;
}
能以某种方式确定吗? (假设选择的类型始终有效,但未选择的类型可能无效)。
【问题讨论】:
-
我认为您正在寻找的术语是“惰性”评估。此外,这看起来很像我几个小时前问的一个问题。我不知道在一般情况下是否有任何方法可以做到这一点,但在这种特殊情况下,“模板模板”参数可能会起作用。
-
“确定两种类型”是什么意思?
-
@jalf 作为使用 TemplateIf 构造的示例
-
你到底想在这里做什么?使用 SFINAE 几乎可以肯定是可行的,但是您以错误的方式进行操作。见meta.stackexchange.com/questions/66377/what-is-the-xy-problem
-
注意
TemplateIf又名boost::conditional/ C++11std::conditional。但正如答案所指出的那样,您需要拆分对无效类型的评估,因为在一个地方输入所有std::iterator_traits<int>::value_type总是一个问题。
标签: c++ templates metaprogramming