gpt4 book ai didi

C++ 模板 : return value by type

转载 作者:太空狗 更新时间:2023-10-29 23:29:58 25 4
gpt4 key购买 nike

我正在学习 C++ 和模板来实现配置文件读取器 ( http://www.adp-gmbh.ch/cpp/chameleon.html ),我正在尝试为一个类创建一个模板,并将 std::string 作为内部存储,它可以在将其分配给变量(double、long double、float、string、uint16_t、uint32_t)时返回其内部值。

平台:Win10 with Visual Studio Community 2015 Update 1

class HybridType {
public:
HybridType() {};
explicit HybridType(const std::string& value) : internalStr(value) {}
explicit HybridType(const char* value) : internalStr (std::string(value)) { }

template<typename T, typename = typename std::enable_if<std::is_arithmetic<T>::value, T>::type>
explicit HybridType(T numericValue) {
std::stringstream strstr;
strstr << std::setprecision(std::numeric_limits<T>::digits10 + 1) << numericValue;
internalStr = strstr.str();
}

operator std::string() const { return internalStr; }

template<typename T>
operator T() const {
if (std::is_same<T, std::uint16_t>::value) return std::stoi(internalStr);
if (std::is_same<T, std::uint32_t>::value) return std::stoul(internalStr);
if (std::is_same<T, std::uint64_t>::value) return std::stoul(internalStr);
if (std::is_same<T, double>::value) return std::stod(internalStr);
if (std::is_same<T, long double>::value) return std::stold(internalStr);
if (std::is_same<T, float>::value) return std::stof(internalStr);
return std::stoll(internalStr);
}



template<typename T> operator T*() { return internalStr.c_str(); }

private:
std::string internalStr;
};

使用它时,我会执行以下操作:

uint32_t test = HybridType("50");
long double test2 = HybridType("50.0");

但是当我编译这个的时候,我收到了很多警告:

1> warning C4244: 'return': conversion from 'double' to 'uint32_t',
possible loss of data 1> see reference to function template
instantiation 'HybridType::operator T(void) const<uint32_t>' being
compiled 1> with 1> [ 1> T=uint32_t 1> ]
1> warning C4244: 'return': conversion from 'long double' to
'uint32_t', possible loss of data 1> warning C4244: 'return':
conversion from 'float' to 'uint32_t', possible loss of data 1>
warning C4244: 'return': conversion from '__int64' to 'uint32_t',
possible loss of data

我真的不明白为什么我会收到这些警告(编译器无法选择合适的类型),因为当我输出我的变量时,它们似乎具有正确的值?

最佳答案

您的问题是 operator T()。从编译器的角度来看。如果为 uint32_t 展开,您会得到:

operator uint32_t() const {
if (...) return std::stoi(internalStr);
if (...) return std::stoul(internalStr);
if (...) return std::stoul(internalStr);
if (...) return std::stod(internalStr);
if (...) return std::stold(internalStr); // Consider here
if (...) return std::stof(internalStr);
return std::stoll(internalStr);
}

在编译器看来,您可能试图从一个应该返回 uint32_t 的函数返回一个 long double。当然,稍后在编译过程中,将优化为:

operator uint32_t() const {
return std::stoul(internalStr);
}

...但到那时,警告已经发出。

修复是:

  • 写下您明确需要的每个转换运算符。 (有关详细信息,请参阅 R Sahu's answer。)这具有更简单和更少键入的优点。
  • 编写一个没有定义的模板化转换运算符声明,然后为您想要的每种类型编写显式特化。 (有关详细信息,请参阅 πάντα ῥεῖ's answer。)它的特点是您必须为您希望能够转换的每种类型创建一个运算符;缺少类型将是一个编译错误。这可能是优势(对范围的更多控制等),也可能是劣势(更多代码),具体取决于您的应用。

formwerapproach的优势

关于C++ 模板 : return value by type,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35043973/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com