【发布时间】:2013-05-08 03:51:31
【问题描述】:
我有一个模板action 方法,它接受任何类型的STL 容器C。但是,包含的项目 (C::value_type) 必须是 ClassA 或 ClassB。到目前为止一切顺利:
struct Whatever {
template<typename C>
void action(const C& c) {
static_assert(std::is_same<typename C::value_type, ClassA>::value ||
std::is_same<typename C::value_type, ClassB>::value,
"Wrong C::value_type");
// do something with c
}
};
// Usage:
Whatever w;
w.action(std::vector<ClassA>{1, 2, 3});
w.action(std::unordered_set<ClassB>{1, 2, 3});
注意:封闭类不是模板,唯一的模板就是action方法。
现在,根据C::value_type,我想专门研究该方法的行为。你猜对了,这就是我的大脑开始融化的地方。
我相信 SFINAE 是要走的路,但显然我太生疏了,无法让它正常工作:几个小时后,大量的助手 structs 和太多的咖啡对我自己的健康不利,编译器只是不停地对我大喊通常的 500 多个模板错误。复制我的助手structs 或这里的错误毫无意义,这几乎是无用的垃圾。
但是,我不得不承认,自从十年来我并没有真正接触过所有的 C++ 模板 (r) 演进(甚至使用 SFINAE),所以难怪我失败得这么厉害。
我强烈怀疑 C++11 现在有简单、易于使用的类似 SFINAE 的工具来实现我想要的,但我什至不知道从哪里开始在文档中搜索。搜索引擎也无济于事,一次太多的新信息让我无法理解与我的问题相关/不相关的内容。
由于我完全不知所措,所以我只是采取婴儿步骤并问...我的问题有两个:
- 如何使用现代 C++11 模板工具根据
C::value_type的实际类型专门化方法的行为? - (可选)是否有标准方法来检查
C是否真的是一个容器?
感谢您的关注。
【问题讨论】:
标签: c++ c++11 sfinae specialization