比较两种类型是否“字面意义上”相同

ouk*_*ore 2 c++

假设我们有两种类型

using t1 = int*; using t2 = int*;
Run Code Online (Sandbox Code Playgroud)

我知道那std::is_same<t1, t2>::value会给我们带来true。什么是,或者说,有没有一个模板工具可以实现以下功能?

tool<t1, t2>::value == false;
tool<t1, t1>::value == true;
Run Code Online (Sandbox Code Playgroud)

我想说这可能是不可能的,但我不是 C++ 专家。

据推测,该工具可以在模板函数中使用,如下所示

using allowed = int*;
using not_allowed = int*;

template <class T>
void f(T var) {
   static_assert(tool<T, allowed>::value &&
                 tool<T, not_allowed>::value == false, "");
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

use*_*522 8

不,没有。t1并且t2实际上是同一类型。using没有引入任何新类型。它只是为已经存在的类型提供一个别名。

如果您想要一个不同但在其他方面相同的类型“副本”,则需要创建一个新类并在新类中实现原始类型的接口。(继承可能会有所帮助,但当“复制”类型是非类类型时,就像这里一样。对于 lambda 而言,您只需再次重复 lambda 即可实现此目的。)

目前无法创建任意类型的独特“副本”,即强 typedef。新类型必须显式实现。(搜索强 typedef应该会给你一些帮助实现它的示例和库。)