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?

本文关键字:类型 形参 编译 一种 是否 方法 可以使 c++ 一个 包含      更新时间:2023-10-16

我想实现这样的东西:

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;

map1map2将有不同的类型