Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.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++ 在C+中确定其返回类型的函数+;_C++_Return - Fatal编程技术网

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

尝试编写一个函数,该函数根据一些预处理器指令确定自己的返回类型。但我不确定C++中是否有可能。

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我们为什么要关心互操作性