函数在C ++中确定其返回类型

时间:2015-12-29 07:37:30

标签: c++ return

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

type ConvertStrIfNecessary(){
    std::str mystr="abcdefghif";
    #ifdef MYCONDITION
    return mystr.c_str();
    #else
    return mystr;
    #endif

}

2 个答案:

答案 0 :(得分:4)

这取决于您的编译器以及它是否支持N3638g++ 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的解决方案)。