【发布时间】:2011-10-20 09:59:48
【问题描述】:
我目前正在做一些模板元编程。就我而言,我可以处理任何“可迭代”类型,即typedef foo const_iterator 以相同方式存在的任何类型。我试图为此使用新的 C++11 模板元编程,但是我找不到检测某个类型是否丢失的方法。
因为我还需要根据其他特性打开/关闭其他模板特化,所以我目前使用的模板有两个参数,第二个是通过std::enable_if 生成的。这是我目前正在做的事情:
template <typename T, typename Enable = void>
struct Foo{}; // default case is invalid
template <typename T>
struct Foo< T, typename std::enable_if<std::is_fundamental<T>::value>::type>{
void do_stuff(){ ... }
};
template<typename T>
struct exists{
static const bool value = true;
};
template<typename T>
struct Foo<T, typename std::enable_if<exists< typename T::const_iterator >::value >::type> {
void do_stuff(){ ... }
};
如果没有 exists 帮助器模板,我无法做这样的事情。例如简单地做
template<typename T>
struct Foo<T, typename T::const_iterator> {
void do_stuff(){ ... }
};
不起作用,因为在应该使用这种特殊化的情况下,无效的默认情况被实例化了。
但是,我在新的 C++11 标准中的任何地方都找不到这个 exists,据我所知,它只是从 boost::type_traits 获取这类东西。然而,在homepage 上,boost::type_traits 并没有显示任何可以替代使用的引用。
是否缺少此功能,或者我是否忽略了其他一些明显的方法来实现所需的行为?
【问题讨论】:
标签: c++ c++11 sfinae template-meta-programming typetraits