为什么 typedef 在函数参数中不提供保护

Why does typedef not offer protection in function parameters?

本文关键字:保护 参数 typedef 函数 为什么      更新时间:2023-10-16

我的印象是,typedef的一个很好的用例是确保不会将错误类型的参数传递给函数。但这似乎并没有由编译器实际强制执行。

有人可以告诉我为什么编译以下内容吗?如果我尝试传递 YourType,我如何才能实现让函数采用 MyType 和编译器抱怨的目标?

#include <iostream>
#include <string>
typedef std::string MyType;
typedef std::string YourType;
void PrintMyString(const MyType& my_type) {
  std::cout << my_type;
}
int main()
{
    MyType my_type = "Hello";
    YourType your_type = " World";
    PrintMyString(my_type);
    PrintMyString(your_type); // should fail?
}
typedef只是

类型的别名,它不会创建新类型。 如果两个typedef别名相同类型,则可以互换它们。

看起来您可以使用强大的 typedef,或者您可以将类型包装在包装类中并使用包装器类作为函数参数。

因为typedef创建别名,而不是新类型。 为此,您需要某种"强类型定义"。 Boost有一个。

这个问题,幻

影类型,偶尔会出现:

  • 增强强型定义

  • 关于程序员堆栈交换的类似问题。

我认为要走的方法是这样的东西:

struct typedef_0 : public specific_type
{
// Add variadic perfect-forwarding ctor here.
};

这将创建一个与specific_type"几乎可以互换"的类型typedef_0。如果你想要另一个,你会称它为其他东西,例如,typedef_1 .

您可以使用它来创建实现"强"类型定义的宏。像这样:

 #define MAKE_STRONG_TYPEDEF(ORIG_TYPE, NEW_TYPE) 
 struct NEW_TYPE : public ORIG_TYPE 
 { 
 template<typename ...T>NEW_TYPE(T &&..t) : 
     ORIG_TYPE(std::forward(T...)(t)){}
 };

(没有尝试编译它,但这是一般的想法。