如果我们不希望模板/泛型中有任何数据类型,该怎么办?

时间:2014-12-14 15:39:11

标签: c++ generics

当我们使用来自STL的通用数据类型或我们自己实现的泛型类时,我们可以选择不指定数据类型...... ???

示例:

如果我正在创建一个图库......某些使用该库的人可能想要在节点中存储一些数据,而某些人可能只对节点之间的连接感兴趣....

所以提供一个通用库,我们把一些数据变量说成

template <class T>
class Graph
{
    T data[number_of_nodes]; // This somehow corresponds to data stored in each node
    Edge e[number_of_edges];
}

不,如果我根本不想要任何数据变量我应该做什么......?

1 个答案:

答案 0 :(得分:2)

如果你允许我将普通数组包装在一个类中,你可以对void有一个明确的特殊化,只需要支付一个额外的字节:

template<int N, class T>
class array {
    T v[N];
    const T &operator[](int i) const { return v[i]; }
    T &operator[](int i) { return v[i]; }
};

template<int N>
class array<N,void> {
    const void operator[](int &i) const {  }
    void operator[](int &i) { }
};

int main()
    cout<<sizeof(array<100,int>)<<endl;
    cout<<sizeof(array<100,void>)<<endl;
}

您也可以对Graph类进行专门化,但我认为仅专注于数组包装器的工作量较少。

无论如何,最好的想法似乎是使Node成为Graph中的泛型类型,提供没有额外数据的基本Node实现,并让用户定义自己的派生节点类型,如&#34; 500所示 - 内部服务器错误&#34;,除非您不需要存储关于图表中节点的任何其他内容。