泛型类型别名,它们彼此不兼容
generic type alias, which are incompatible to each other
我正在尝试构造某种"泛型类型别名",这意味着我想将类型定义为int
例如,但使用泛型类型参数,然后使其与其他类型的实例不兼容。
我尝试使用别名模板执行此操作:
template <typename T>
using NumberWithSemantics = int;
但这样做的问题是,所有实例化,无论类型如何T
,都被认为是相等的,例如:
struct A {};
struct B {};
NumberWithSemantics<A> getThing() {
return 14;
}
int processDifferentThing(NumberWithSemantics<B> b) {
return b * 3;
}
int main() {
auto a = getThing();
return processDifferentThing(a); // unfortunately compiles just fine
}
有没有办法定义某种不允许混合不同模板实例化的泛型类型别名?
C++具有类型别名,但它只是弱类型别名。当你说
typedef int MyType;
或
using MyType = int;
你告诉编译器,"每当你看到MyType
时,假装你刚刚看到了int
"。那么MyType i
和int i
之间根本没有区别;两者都创建一个名为i
的int
类型的变量。将using
声明设置为模板无济于事;所有类型等同地表示int
。
您要做的是创建一个实际的新类型。为此,您需要用struct
或class
声明它,而不仅仅是using
.即使它们看起来相同,类型系统也会将通过这种方式创建的每个新类型视为单独的类型;推而广之,如果您将模板设为struct
,则每个实例化都将是一个新类型。
因此,最小的潜在解决方案是:
template <typename T>
struct NumberWithSemantics { int i; };
然后,您可以将NumberWithSemantics<A>
和NumberWithSemantics<B>
用作不同的类型。但是,您需要不断说.i
才能获得实际值,这可能会使您的代码更难阅读。有多种可能的方法可以解决这个问题,为此我建议阅读有关 Fluent C++ 的强类型系列的这一部分。
相关文章:
- 我收到同义重复编译器错误。我应该如何修复"类型"X"的参数与类型"X"的参数不兼容?
- 字符类型转换不兼容
- Qt:如何使不兼容的发送方/接收方参数兼容?
- 视觉工作室 2017;启用 /permissive 时,类型 "const wchar_t *" 的参数与类型 "PWSTR" 的参数不兼容
- 使用不兼容的分配器复制分配无序列图
- 类型为 "int*" 的参数与 C++ 中错误类型"int**"参数不兼容
- 该对象具有与成员函数不兼容的类型限定符.为什么会出现此错误?
- 我正在尝试将表的地址传递给要在另一个函数中使用的指针,但得到不兼容的指针类型
- 为什么范围算法与 std 的迭代器不兼容?
- Winpcap Findalldevs const char * 与 char * 不兼容
- C++ 类型的参数与 void (__cdecl*)(void) 类型的参数不兼容,当调用 std::atexit()
- 将"std::string {aka std::basic_string}"赋值中的不兼容类型<char>
- 如何在C++中停止调用不兼容的方法?
- OPENCL 警告:不兼容的指针类型将'float __global[16]'传递给类型为 '__global float4 的参数 *
- 函数范围的静态变量如何导致与共享库中函数代码的未来使用不兼容
- 如何修复"方法的类型与 PInvoke 不兼容"
- C++不兼容的迭代器类型
- 编译器错误"在if语句中分配不兼容的类型"
- 程序无法编译:将 'int (*)[3][3]' 赋值为 'int [9][3][3]' 中的不兼容类型
- 泛型类型别名,它们彼此不兼容