为什么模板化的函数参数已解析但不是模板化的返回类型?

时间:2014-07-22 08:25:58

标签: c++ templates

我有以下几段代码:

int APIENTRY _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPTSTR lpCmdLine, _In_ int nCmdShow)
{
    int serialport = getCommandLineOption<int>(lpCmdLine, "-com", atoi);
    ...

template<typename T>
T getCommandLineOption(const std::string& commandLine, const std::string& option, std::function<T(const char*)> f)
{
    auto result = getCommandLineOption(commandLine, option);
    return result.empty() ? T() : f(result.c_str());
}

const std::string getCommandLineOption(std::string commandLine, std::string option)
{
    ...

然后我删除了functional标头的包含,并将模板功能更改为:

template<typename T, typename F>
T getCommandLineOption(const std::string& commandLine, const std::string& option, F f)
{
    auto result = getCommandLineOption(commandLine, option);
    return result.empty() ? T() : f(result.c_str());
}

现在在WinMain我调用函数来获取串口参数我不能省略int类型规范但是我可以省略函数指针类型规范。为什么呢?

PS:getCommandLineOption函数在静态库中,静态库由包含WinMain的项目使用。

1 个答案:

答案 0 :(得分:0)

返回类型不能由编译器推导出来。你可以使用:

template<typename F>
auto
getCommandLineOption(const std::string& commandLine, const std::string& option, F f)
-> decltype(f(getCommandLineOption(commandLine, option).c_str()))
// or decltype(f(declval<const char*>()))
{
    auto result = getCommandLineOption(commandLine, option);
    return result.empty() ? decltype(f(result.c_str())){} : f(result.c_str());
}

Live example