c++ - 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
结果,但它显示了这个错误。
解决方案
您需要使用constexpr
if 语句,否则编译器将尝试编译每个可能的路线。
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;
}