英文:
How does one deal with different types when using custom allocated strings?
问题
我已经开始在一个视频游戏项目中尝试使用自定义分配器与 std::basic_string
。这是我第一次涉及自定义分配器,所以我正在学到很多东西。
但问题是,我想能够调用任何接受 "string" 参数的函数,使用任何 std::basic_string
(比如 std::string
、std::basic_string<char, std::char_traits<char>, custom_allocator<char>
等等)。
然而,提供一个自定义分配器会 "改变" std::basic_string
的类型(我的意思是,它与我一直在使用的 std::string
不同)。
所以我考虑了不同的解决方案:
- 在函数中使用模板编程以接受
T
,但是到处使用模板似乎有点繁琐和过度复杂。 - 到处切换到 C 风格的字符串,并提供
my_string.c_str()
,但考虑到失去了 C++ 的特性,这似乎是一个非常糟糕的主意。 - 实现自己的
String
基类,并使所有的CustomAllocatedString
都从它继承。这是一个个人项目,所以我不介意尝试,但我知道实现自己的 "STL" 可能非常耗时(还有其他问题)。 - 在我的研究过程中,我了解到了多态分配器和
std::pmr::string
(我使用的是 C++ 17)。尽管这似乎包含了内存开销(以及间接性),但它非常有趣。 - 我是不是忽略了一些非常明显的东西?
你对此有什么看法?或者最终在一个类型中混合不同的分配方法是一个非常糟糕的主意吗?
英文:
I have started experimenting using custom allocators with std::basic_string
in a video game project. This is my first time dealing with custom allocators, so I'm learning a lot.
But the problem is, I would like to be able to call any function taking a "string" parameter with any std::basic_string
(std::string
, std::basic_string<char, std::char_traits<char>, custom_allocator<char>
, etc.).
However, providing a custom allocator "changes" the type of std::basic_string
(I mean, it differs from std::string
that I've been using).
So I thought of different solutions:
- Use template programming in functions to take a
T
instead... but using templates everywhere seems a bit tedious and overkill... - Switch to C-style strings everywhere, and provide
my_string.c_str()
, which seems like a very bad idea, considering the loss of C++ features. - Implement my own
String
base class and make all theCustomAllocatedString
inherit from it. This is for a personal project, so I don't mind experimenting, but I know that implementing my own "STL" can be very time consuming (among other things). - During my research, I learned about polymorphic allocators and
std::pmr::string
(I use C++ 17). Although this seems to include memory overhead (plus the indirection), it's really interesting. - Am I missing something really obvious here?
What do you think about this? Or is mixing different allocation methods with a single type a really bad idea in the end?
答案1
得分: 2
The solution might be to use string_view
instead; that way functions don't have to deal with how strings are allocated.
#include <iostream>
#include <string>
#include <string_view>
void foo(const std::string_view str)
{
std::cout << str;
}
int main()
{
std::string s = "Hello";
std::pmr::string s2 = "World";
foo(s);
foo(" ");
foo(s2);
foo("\n");
}
英文:
The solution might be to use string_view
instead; that way functions don't have to deal with how strings are allocated.
#include <iostream>
#include <string>
#include <string_view>
void foo(const std::string_view str)
{
std::cout << str;
}
int main()
{
std::string s = "Hello";
std::pmr::string s2 = "World";
foo(s);
foo(" ");
foo(s2);
foo("\n");
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论