首页 > 解决方案 > C ++模板函数不能将'std:string'转换为'double'作为回报

问题描述

我有一个从环境变量中获取数据的函数。当我提到数值类型时它工作正常,但是当我提到值应该是字符串类型时,它会在编译时出错:

g.cc: In instantiation of ‘T result(const char *, const T&) [with T = double; std::string = std::__cxx11::basic_string<char>]’:
g.cc:65:88:   required from here
g.cc:23:33: error: cannot convert ‘std::string’ {aka ‘std::__cxx11::basic_string<char>’} to ‘double’ in return
   23 |       return std::string(env_val);
      |                            
#include <iostream>
#include <cstdlib>
#include <type_traits>

template <typename T>
T result(const char *key, const T &default_value) {
    char *env_val = getenv(key);
    if (std::is_integral<T>::value)
        return atoi(env_val);
    else if(std::is_floating_point<T>::value)
        return atof(env_val);
    else if(std::is_base_of<std::string<char>, T>::value)
        return std::string(env_val);
    return default_value;
}

int main() {
    result<int>("test1", 12);          // Ok
    result<double>("test2", 12.2);       // Ok
    result<std::string>("test3", "test3");  // ERROR
}

我已经提到返回T结果,但它显示了这个错误。

标签: c++typescompilation

解决方案


您需要使用constexprif 语句,否则编译器将尝试编译每个可能的路线。

T result(const char *key, const T &default_value ) {
    char *env_val = getenv(key);
    if constexpr (std::is_integral<T>::value)
        return atoi(env_val);
    else if constexpr (std::is_floating_point<T>::value)
        return atof(env_val);
    else if constexpr (std::is_base_of<std::string, T>::value)
        return std::string(env_val);
    return default_value;
}

推荐阅读