c++ 03:是否有一种方法可以使一个类型每次被包含在模板形参中时都会编译成不同的类型?
C++03: Is there a way to make a type that will compile to different types every time it is included in a template parameter?
我想实现这样的东西:
typeof(vector<MyStrangeType>) != typeof(vector<MyStrangeType>)
。我希望这个类型每次作为模板参数包含时都产生一个不同的类型。
在这种情况下,我可能实际需要它的一个例子是避免未定义行为:
class DeviousHashAlg {
private:
int seed;
public
DeviousHashAlg() {
seed = rand();
}
template<class TYPE>
size_t operator()(TYPE key) {
return hash<TYPE>()(key) * seed
}
}
unordered_map<SomeKey, SomeValue, DeviousHashAlg> map1;
unordered_map<SomeKey, SomeValue, DeviousHashAlg> map2;
map1 == map2; // Currently undefined
比较这些映射是未定义的行为,因为内部的值不会被散列到相同的buck。我想做的是使这个未定义的行为而不是编译时错误。这就是为什么我希望DeviousHashAlg
每次包含在像unordered_map
这样的模板中时都产生不同的类型,这样我们就不允许使用==
。
这可能吗?如果可能的话,我更喜欢使用语言支持,尽管我怀疑一些预处理黑魔法可能是唯一的解决方案。
您可以使用宏__COUNTER__
并使您的类模板如下:
template <std::size_t N>
struct DeviousHashAlg
{
/* Your code */
};
#define UNIQUE_DeviousHashAlg DeviousHashAlg<__COUNTER__>
然后对于
unordered_map<SomeKey, SomeValue, UNIQUE_DeviousHashAlg> map1;
unordered_map<SomeKey, SomeValue, UNIQUE_DeviousHashAlg> map2;
map1
和map2
将有不同的类型
相关文章:
- 非类型引用形参/实参
- 如何确保迭代器模板形参与模板类的模板形参具有相同的数据类型
- 如何在编译时通过模板形参默认值的名称/指针获取函数的类型
- 模板类的不同返回类型取决于类的形参
- 指向函数的指针vs作为模板非类型形参的函数
- 具有不同值类型模板形参的模板类的数组或向量
- 为什么模板非类型形参指针和引用实参需要是全局的
- 可以使用MemberFunction类型作为模板形参吗?
- c++ 03:是否有一种方法可以使一个类型每次被包含在模板形参中时都会编译成不同的类型?
- 将非const引用使用auto-keyword声明的lambda作为实参传递给std::函数形参类型
- 为什么标准不允许在模板形参列表中初始化依赖于常量的类型
- 在模板演绎中保持函数指针形参的完整类型
- 使用传入的字符串形参来访问类型中的内容
- 不能在模板专门化定义中将一个类的成员类型定义用作模板形参
- 使用函数返回值作为默认模板非类型形参
- 扩展非类型形参包来定义带有非类型形参的内部类模板是否合法?
- c++模板非类型形参的类型演绎
- 为静态成员函数模板非类型形参
- 带有不同类型的非类型形参的c++可变模板
- 非类型形参取决于它后面的实参