C++ 为什么typedef在功能参数中不提供保护?
我的印象是,typedef的一个好用例是确保不会将错误类型的参数传递给函数。但编译器似乎并没有真正执行这一点 有人能告诉我为什么要编译下面的代码吗?如果我试图传递YourType,我如何实现让函数接受MyType和编译器抱怨的目标C++ 为什么typedef在功能参数中不提供保护?,c++,typedef,C++,Typedef,我的印象是,typedef的一个好用例是确保不会将错误类型的参数传递给函数。但编译器似乎并没有真正执行这一点 有人能告诉我为什么要编译下面的代码吗?如果我试图传递YourType,我如何实现让函数接受MyType和编译器抱怨的目标 #include <iostream> #include <string> typedef std::string MyType; typedef std::string YourType; void PrintMyString(const
#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 std::字符串MyType;
typedef std::字符串类型;
无效PrintMyString(常量MyType和my_类型){
std::couttypedef
s只是一个类型的别名,它不会生成新的类型。如果两个typedef
s别名都是相同的类型,则可以交换它们
看起来您可以使用强类型定义,或者您可以将类型包装在包装类中,并将包装类用作函数参数。因为typedef
创建了一个别名,而不是一个新类型。为此,您需要某种“强类型定义”。Boost有一个这样的问题。对于幻象类型,这个问题偶尔会出现:
我认为应该这样做:
struct typedef_0 : public specific_type
{
// Add variadic perfect-forwarding ctor here.
};
这将创建一个类型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)){}
};
#定义MAKE_STRONG_TYPEDEF(原始类型、新类型)\
结构新类型:公共源类型\
{ \
模板新类型(T&&..T):\
原始类型(std::forward(T…(T)){}
};
(我没有试着编译它,但这只是一般的想法。)谢谢。你知道我可以使用Boost之外的东西吗?也许“typedef”不是我想要的。@cppuser1可能是一个新类。