gpt4 book ai didi

C++11:根据容器的 value_type 专门化/限制方法

转载 作者:太空狗 更新时间:2023-10-29 21:02:03 27 4
gpt4 key购买 nike

我有一个模板action 方法,它接受任何类型的STL 容器C。但是,包含的项 (C::value_type) 必须是 ClassAClassB。到目前为止一切顺利:

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)evolutions(甚至当时使用 SFINAE),所以难怪我失败得如此惨烈。

我强烈怀疑 C++11 现在有简单易用的类似 SFINAE 的工具来实现我想要的,但我什至不知道从哪里开始搜索文档。搜索引擎也没有帮助,一次有太多新信息让我无法理解什么与我的问题相关/不相关。

由于我完全不知所措,所以我会采取一些小步骤来问...我的问题有两个:

  • 如何使用现代 C++11 模板工具根据 C::value_type 的实际类型专门化方法的行为?
  • 可选,是否有标准方法来检查 C 是否真的是一个容器?<​​/strong>

感谢您的关注。

最佳答案

我想知道你为什么不这样做:

 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");

action_worker(c, static_cast<typename C::value_type*>(0));
}

private:

template<typename C>
void action_worker(const C& c, ClassA *)
{
//specialized code when C::value_type is ClassA
}

template<typename C>
void action_worker(const C& c, ClassB *)
{
//specialized code when C::value_type is ClassB
}

现在根据 C::value_typeaction_worker 的第二个参数可以是 ClassA*ClassB*。这将使编译器能够在您编写专用代码的位置选择正确的重载。

对于问题的第二部分,请参阅此答案中 is_container 类模板的实现:

希望对您有所帮助。

关于C++11:根据容器的 value_type 专门化/限制方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16432337/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com