尝试编写一个函数,根据一些预处理器指令确定自己的返回类型。但我不确定这是否可以在C ++中使用。
type ConvertStrIfNecessary(){
std::str mystr="abcdefghif";
#ifdef MYCONDITION
return mystr.c_str();
#else
return mystr;
#endif
}
答案 0 :(得分:4)
这取决于您的编译器以及它是否支持N3638(g++ since 4.9):
/*
vvvv "auto" is enough */
auto ConvertStrIfNecessary(){
std::string mystr="abcdefghif";
#ifdef MYCONDITION
return mystr.c_str();
#else
return mystr;
#endif
}
您需要在GCC中使用-std=c++14
启用C ++ 14。请记住,C ++ 14支持仍然是实验性的。请注意,仅当函数中的所有return
都返回相同类型的值时,此方法才有效。由于预处理后只有一个return
,所以在这种情况下它很好。
然后,您的用户可以再次使用auto
:
auto theValue = ConvertStrIfNecessary();
话虽如此,如果返回mystr.c_str()
,您的代码会产生未定义的行为,因为当c_str()
超出范围时mystr
返回的指针无效。
更糟糕的是,const char*
和std::string
具有不同的语义,并且代码很可能以后不会编译,因为某些客户端使用theValue
作为char*
,其他人使用了它为std::string
。
如果你真的想要不同的类型,你可以提供一个通用的界面类型:
#ifdef MYCONDITION
using stringlike_t = const char *;
#else
using stringlike_t = std::string;
#endif
这使您可以控制用户可以使用的“安全”方法。
答案 1 :(得分:1)
如果您想使用预处理器命令执行所有操作,则可以定义自己的字符串类型
#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 ++,则更喜欢像auto
这样的解决方案(参见Zeta的解决方案)。