gpt4 book ai didi

c++ - 模板类型扣: distinguish by typedef

转载 作者:太空狗 更新时间:2023-10-29 20:42:39 26 4
gpt4 key购买 nike

如何通过 typedef 区分模板参数?

情况:我有几种类型的列表(作为 vector 实现)。我有一个特殊的 StringList,我想以不同的方式处理它。

typedef std::vector<std::string> StringList;

inline void f(StringList const& list) {
...
}

template <typenamte T>
inline void f(std::vector<T> const& list) {
...
}

如果我的变量定义为 StringList当变量定义为 std::vector<std::string> 时,我希望调用第一个版本我想调用第二个版本。但是StringListstd::vector<std::string>调用第一个版本。使用 using给出相同的行为。

如果那是不可能的,一个合理的解决方法的想法会很好。

当然是扩展std::vector<std::string>会有所帮助,但由于这根本不是一个好主意,我不知道如何区分它们。

最佳答案

您至少有三个选择:

#include <vector>
#include <string>

// option 1

struct StringList : std::vector<std::string>
{
// optionally forward the constructors of std::vector that are called
};

// option 2

struct String : std::string
{
// optionally forward the constructors of std::string that are called
};

typedef std::vector<String> StringList;

// option 3

struct StringTag
{
};

typedef std::allocator<StringTag> StringAllocator;

typedef std::vector<std::string, StringAllocator> StringList;

第一个和第二个选项都需要转发一些基类的构造函数。第二个选项可能更好,基于这样的假设:您可能只需要在将字符串添加到字符串列表时转发 std::string 复制构造函数。

第三个选项是我最喜欢的 - 部分原因是它是偷偷摸摸的 hack,但也因为它不需要继承或转发。它之所以有效,是因为从未使用过 std 容器中分配器模板参数的 T 参数。

编辑:C++ 标准暗示分配器的 value_type 必须与容器的 value_type 相匹配 - 因此您只能使用第三个选项如果您的标准库实现允许的话。如果没有,我会推荐第一个或第二个选项。

编辑 2:另见:Is it wrong if the standard container element type and std::allocator type are different?

关于c++ - 模板类型扣: distinguish by typedef,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17943986/

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