gpt4 book ai didi

c++ - 具有 begin() end() size() 功能的所有容器类型的模板

转载 作者:行者123 更新时间:2023-11-30 01:12:00 25 4
gpt4 key购买 nike

下面的模板代码是为 vector 编写的。它不会编译,因为一个调用使用的是列表而不是 vector 。我想重写模板,使其适用于任何容器。对该容器的限制是它需要包含一个类型 T、一个 begin()、一个 end() 和一个 size();

这可以用模板来完成吗?我该怎么做?

#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <typeinfo>

namespace std
{
template <typename T>
string to_string(T s) { return typeid(T).name(); }
string to_string(string s) { return s; }
}

template<typename T, typename A = std::allocator<T>>
static std::string range_to_string(std::vector<T, A> const& vec)
{
bool more = false;
std::string str = "size:" + std::to_string(vec.size()) + " [";
for (const T & item : vec)
{
if (more) { str += ", "; }
str += std::to_string(item);
more = true;
}
str += "]";
return str;
}

void demo1()
{
std::string dat[] = {"one", "two", "three"};
std::vector<std::string> vs(dat, dat + 3);
std::cout << range_to_string(vs) << std::endl;
}

void demo2()
{
std::list<short> ls= {1, 2, 3, 4};
std::cout << range_to_string(ls) << std::endl;
}

int main()
{
demo1();
demo2();
return 0;
}

最佳答案

我找到了答案 here .

看起来这是常识。

#include <iostream>
#include <string>
#include <vector>
#include <list>
#include <typeinfo>

namespace std
{
template <typename T>
string to_string(T s) { return typeid(T).name(); }
string to_string(short s) { return to_string((int) s); }
string to_string(string s) { return s; }
}

template<typename T, typename A = std::allocator<T>, template <typename, typename> class container>
static std::string range_to_string(container<T, A> const& vec)
{
bool more = false;
std::string str = "size:" + std::to_string(vec.size()) + " [";
for (const T & item : vec)
{
if (more) { str += ", "; }
str += std::to_string(item);
more = true;
}
str += "]";
return str;
}

void demo1()
{
std::string dat[] = {"one", "two", "three"};
std::vector<std::string> vs(dat, dat + 3);
std::cout << range_to_string(vs) << std::endl;
}

void demo2()
{
std::list<short> ls= {1, 2, 3, 4};
std::cout << range_to_string(ls) << std::endl;
}

int main()
{
demo1();
demo2();
return 0;
}

关于c++ - 具有 begin() end() size() 功能的所有容器类型的模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34947125/

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