为什么 typedef 在函数参数中不提供保护
Why does typedef not offer protection in function parameters?
我的印象是,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)){}
};
(没有尝试编译它,但这是一般的想法。
相关文章:
- 如何反转整数参数包
- 使用C++库在Android项目中修改gradle中的cmake参数,用于插入指令的测试
- 如何使用默认参数等选择模板专业化
- 模板参数替换失败,并且未完成隐式转换
- 具有默认模板参数的多态类的模板推导失败
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 函数调用中参数的顺序重要吗
- 部分定义/别名模板模板参数
- 模板-模板参数推导:三个不同的编译器三种不同的行为
- 使用不带参数的函数访问结构元素
- 基于另一个成员参数将函数调用从类传递给它的一个成员
- 如何在OMNET++中指定与命令行参数组合的输出文件名
- 如何使用Luacneneneba API正确读取字符串和表参数
- 在派生函数中指定void*参数
- 将派生类构造函数参数传递给受保护的成员
- 来自模板参数的派生类没有受保护的成员访问权限
- 为什么我无法访问作为参数传递到函数中的基类的受保护成员变量?
- 为什么 typedef 在函数参数中不提供保护
- 为什么不能将受保护的嵌套类用作另一个嵌套受保护类的模板参数?