Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么typedef在功能参数中不提供保护?_C++_Typedef - Fatal编程技术网

C++ 为什么typedef在功能参数中不提供保护?

C++ 为什么typedef在功能参数中不提供保护?,c++,typedef,C++,Typedef,我的印象是,typedef的一个好用例是确保不会将错误类型的参数传递给函数。但编译器似乎并没有真正执行这一点 有人能告诉我为什么要编译下面的代码吗?如果我试图传递YourType,我如何实现让函数接受MyType和编译器抱怨的目标 #include <iostream> #include <string> typedef std::string MyType; typedef std::string YourType; void PrintMyString(const

我的印象是,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 std::字符串MyType;
typedef std::字符串类型;
无效PrintMyString(常量MyType和my_类型){

std::cout
typedef
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可能是一个新类。