问题
Look at this code.
#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;
}
It does not compile, because f
is being redeclared. I totally understand the error. However, I need a second class that behaves like std::vector<T>
, but will be seen as a different type, so that overloading, like in the above example, would be legal.
What could I do?
- Let the new class have
std::vector<T>
as a base class. This might work, but one should not inherit from std containers. - Let the new class have a member of type std::vector and then redeclare all functions to redirect to the functions of the member. Sounds like a lot of work.
Any better alternative? C++11 or C++14 allowed.
回答1:
You might try to mess with the allocator:
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>>;
Live example
回答2:
If you need more than one copy, you can make it a template and take an int
template arg for "clone number"
回答3:
You may wrap your type as follow:
// 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;
};
And so for your case:
template<class T>
using other_vector = WrapperType<std::vector<T>>;
来源:https://stackoverflow.com/questions/20973526/rename-stdvector-to-another-class-for-overloading