C++ 在C+中确定其返回类型的函数+;
尝试编写一个函数,该函数根据一些预处理器指令确定自己的返回类型。但我不确定C++中是否有可能。C++ 在C+中确定其返回类型的函数+;,c++,return,C++,Return,尝试编写一个函数,该函数根据一些预处理器指令确定自己的返回类型。但我不确定C++中是否有可能。 type ConvertStrIfNecessary(){ std::str mystr="abcdefghif"; #ifdef MYCONDITION return mystr.c_str(); #else return mystr; #endif } 这取决于您的编译器以及它是否支持(): 您需要在GCC中使用-std=C++14启用C++14
type ConvertStrIfNecessary(){
std::str mystr="abcdefghif";
#ifdef MYCONDITION
return mystr.c_str();
#else
return mystr;
#endif
}
这取决于您的编译器以及它是否支持(): 您需要在GCC中使用
-std=C++14
启用C++14。请记住,C++14支持仍然是实验性的。请注意,只有当函数中的所有返回s返回相同类型的值时,这才有效。由于预处理后只有一个返回值
,因此在本例中没有问题
然后,您的用户可以再次使用auto
:
auto theValue = ConvertStrIfNecessary();
也就是说,如果返回mystr.c_str()
,代码会产生未定义的行为,因为c_str()
返回的指针在mystr
超出范围时无效
更糟糕的是,const char*
和std::string
具有不同的语义,并且代码很可能不会在以后编译,因为一些客户端将value
用作char*
,而其他人将其用作std::string
如果您确实需要不同的类型,您可以提供一个通用接口类型:
#ifdef MYCONDITION
using stringlike_t = const char *;
#else
using stringlike_t = std::string;
#endif
这使您可以控制用户可以使用的“安全”方法。这取决于您的编译器以及它是否支持():
您需要在GCC中使用-std=C++14
启用C++14。请记住,C++14支持仍然是实验性的。请注意,只有当函数中的所有返回s返回相同类型的值时,这才有效。由于预处理后只有一个返回值
,因此在本例中没有问题
然后,您的用户可以再次使用auto
:
auto theValue = ConvertStrIfNecessary();
也就是说,如果返回mystr.c_str()
,代码会产生未定义的行为,因为c_str()
返回的指针在mystr
超出范围时无效
更糟糕的是,const char*
和std::string
具有不同的语义,并且代码很可能不会在以后编译,因为一些客户端将value
用作char*
,而其他人将其用作std::string
如果您确实需要不同的类型,您可以提供一个通用接口类型:
#ifdef MYCONDITION
using stringlike_t = const char *;
#else
using stringlike_t = std::string;
#endif
这使您可以控制用户可以使用的“安全”方法。如果您想使用预处理器命令执行所有操作,您可以定义自己的字符串类型
#ifdef MYCONDITION
#define STRING_TYPE const char*
#else
#define STRING_TYPE std::string
#end
那么你的功能就是
STRING_TYPE ConvertStrIfNecessary(){
std::string mystr="abcdefghif";
#ifdef MYCONDITION
return mystr.c_str();
#else
return mystr;
#endif
}
但是,再次注意返回.c_str()
。但是,除了使用<代码> STD::String ,这是C的方式,如果你使用C++(参见Zeta的解决方案),就喜欢一个解决方案,比如“代码> Auto <代码>。 < P>如果你想用预处理器命令做任何事情,你可以定义自己的字符串类型
#ifdef MYCONDITION
#define STRING_TYPE const char*
#else
#define STRING_TYPE std::string
#end
那么你的功能就是
STRING_TYPE ConvertStrIfNecessary(){
std::string mystr="abcdefghif";
#ifdef MYCONDITION
return mystr.c_str();
#else
return mystr;
#endif
}
但是,再次注意返回.c_str()
。但是,除了使用<代码> STD::String ,这是C的方式,如果你使用C++(参见Zeta的解决方案),就更喜欢一个解决方案,比如“代码> Auto <代码>。你的代码>如果您在之后使用char*
,那么您必须在任何地方使用MYCONDITION预处理器,例如,还应使用预处理器条件指定“type”,并使用char*或std::string。另外,当他们调用你的函数时,他们还必须编写预处理器条件的东西。提供不同返回类型的正确方法是通过该函数的重载。是的,这确实是我的问题。有没有办法避免这种情况?这个函数只是为了显示我想要实现的功能。根据某些条件返回不同类型的函数(不必是预处理器,它也可以是简单的if-else语句)如果在后面使用char*
,则#ifdef MYCONDITION
会产生未定义的行为,例如,“type”也应该使用预处理器条件指定,并具有char*或std::string。另外,当他们调用你的函数时,他们还必须编写预处理器条件的东西。提供不同返回类型的正确方法是通过该函数的重载。是的,这确实是我的问题。有没有办法避免这种情况?这个函数只是为了显示我想要实现的功能。根据某些条件返回不同类型的函数(不必是预处理器,也可以是简单的if-else语句)为什么#define STRING_TYPE
?为什么不typedef。。StrugyType 或使用StrgnTyEP= < /C> >,它给出更好的错误消息?@ zeta,因为它是所有C型预处理器,并且将在C和C++头中工作(只要<代码> MyType 是<代码>α-CPLUS PLUS )。<代码>使用…<代码>,当然。但是typedef
在C头文件中是安全的。@ilent2当不需要时,我们为什么要关心与C的互操作性?我们对Java或Python也不做同样的处理。如果std::string
是一个有效的选项,那就排除了C anywya。@Angew没有理由,我只是认为这是一个有趣的推论,如果OPs问题与导入一些使用char*
的C库有关,那么可能有点相关或值得考虑。为什么定义字符串类型
?为什么不typedef。。StrugyType 或使用StrgnTyEP= < /C> >,它给出更好的错误消息?@ zeta,因为它是所有C型预处理器,并且将在C和C++头中工作(只要<代码> MyType 是<代码>α-CPLUS PLUS )。<代码>使用…<代码>,当然。但是typedef
在C头文件中是安全的。@ilent2我们为什么要关心互操作性