gpt4 book ai didi

使用模板围绕任何集合类型的 C++ 包装器

转载 作者:可可西里 更新时间:2023-11-01 18:29:02 25 4
gpt4 key购买 nike

对c++非常陌生,但是对模板有疑问

假设我有一个简单的模板类,定义如下:

template<typename Collection>
class MySack {
private:
Collection c;

public:
typedef typename Collection::value_type value_type;

void add(const value_type& value) {
c.push_back(value);
}
};

该类的目的是接受任何类型的集合,并允许用户为指定的 typename Collection 插入正确类型的值。

明显的问题是,这仅适用于定义了 push_back 方法的类型,这意味着它适用于 list 但不适用于 设置

我开始阅读有关模板特化的内容,看看是否有任何帮助,但我认为这不会提供解决方案,因为必须知道集合中包含的类型。

如何在 C++ 中解决这个问题?

最佳答案

您可以使用 std::experimental::is_detectedif constexpr 使其工作:

template<class C, class V>
using has_push_back_impl = decltype(std::declval<C>().push_back(std::declval<V>()));

template<class C, class V>
constexpr bool has_push_back = std::experimental::is_detected_v<has_push_back_impl, C, V>;

template<typename Collection>
class MySack {
private:
Collection c;

public:
typedef typename Collection::value_type value_type;

void add(const value_type& value) {
if constexpr (has_push_back<Collection, value_type>) {
std::cout << "push_back.\n";
c.push_back(value);
} else {
std::cout << "insert.\n";
c.insert(value);
}
}
};

int main() {
MySack<std::set<int>> f;
f.add(23);

MySack<std::vector<int>> g;
g.add(23);
}

关于使用模板围绕任何集合类型的 C++ 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49935264/

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