【发布时间】:2014-01-07 13:59:31
【问题描述】:
看看这段代码。
#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。
【问题讨论】:
-
看看
BOOST_STRONG_TYPEDEF。如果它不适用于模板,您可能会汲取灵感来制作一些可以使用的东西。 -
你确定你需要两个几乎相同类型的函数吗?
-
你能说出你为什么需要它吗?为什么不使用
struct vector_wrapper{ std::vector<T> vector; };? -
@StoryTeller 是的,为什么不呢?
-
只要您知道不该做什么,从标准容器继承是可以的(尽管不常用)。缺少虚拟析构函数会造成伤害,但前提是您允许/要求其行为。