将std::vector重命名为另一个类以便重载?

6

看看这段代码。

#include <vector>

template<class ...Args>
using other_vector = std::vector<Args...>;

template<class T>
void f(std::vector<T>& ) {}
template<class T>
void f(other_vector<T>& ) {}

int main()
{
    other_vector<int> b;
    f(b);
    return 0;
}

它不会编译,因为f被重新声明了。我完全理解这个错误。但是我需要一个行为类似于std::vector<T>的第二个类,但将被视为不同的类型,以便重载(就像上面的示例)是合法的。
我该怎么办?
- 让新类拥有std::vector<T>作为基类。这可能有效,但不应从std容器继承。 - 让新类具有std :: vector类型的成员,然后重新声明所有函数以重定向到成员的函数。听起来很费力。 - 有更好的替代方案吗?允许C++11或C++14。

6
请查看BOOST_STRONG_TYPEDEF。如果它在模板中无法正常工作,你可以从中获得灵感,以创建能够正常工作的类似东西。 - chris
1
你确定需要两个函数来处理几乎相同的类型吗? - StoryTeller - Unslander Monica
1
你能说一下为什么需要它吗?为什么不使用struct vector_wrapper{ std::vector<T> vector; }; - zch
@StoryTeller 当然可以,为什么不呢? - Johannes
2
从标准容器继承是可以的(尽管不常用),只要您知道什么是不能做的。缺乏虚析构函数会带来问题,但只有在您允许/需要使用它的情况下才会出现。 - chris
显示剩余3条评论
3个回答

18

您可能会尝试更改分配器:

template<class T>
struct allocator_wrapper : T { using T::T; };

template<class T, class A = std::allocator<T>>
using other_vector = std::vector<T, allocator_wrapper<A>>;

实时示例


使用 T::T; 哇哦 O.O +1 - StoryTeller - Unslander Monica
1
@Johannes 如果你需要更多这些不同类型,只需向allocator_wrapper添加一个整数参数,就可以拥有任意数量的它们... :) - Daniel Frey
@DanielFrey 好主意,给你评论和回答点赞。 - Glenn Teitelbaum
为什么不直接使用以下代码:template<class T, class A = std::allocator<T>> struct other_vector : std::vector<T, A> { using std::vector<T, A>::vector; };? - kiba
@kiba 有时候你需要类本身是std::vector,而不仅仅是从它派生的某些东西,这里有一个例子可以展示出差别可检测,虽然使用情况可能不多,但确实存在。 - Daniel Frey

0
你可以按照以下方式来包装你的类型:
// N allow to have several 'version' of the same type T
template <typename T, int N = 0>
class WrapperType
{
public:
    WrapperType() = default;
    WrapperType(const WrapperType&) = default;
    WrapperType(WrapperType&&) = default;

    template <typename ... Ts>
    explicit WrapperType(Ts&& ... ts) : t(std::forward<Ts>(ts)...) {}

    // implicit conversion
    // you may prefer make them explicit or use name get().
    operator const T& () const { return t; }
    operator T& () { return t; }

private:
    T t;
};

所以针对您的情况:

template<class T>
using other_vector = WrapperType<std::vector<T>>;

0
如果您需要多个副本,可以将其制作为模板,并为“克隆数量”使用一个int模板参数。

但是我仍然需要使用我提到的两个点之一,带有上述缺点? - Johannes
@Johannes 是的,但是你可以将 int 模板参数与你对于克隆一个对象的解决方案结合起来,以扩展到 N 个对象。 - Glenn Teitelbaum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接