【发布时间】:2020-11-06 10:50:36
【问题描述】:
我正在尝试编写一个模板类,该类将包装一个类型,该类型可以是原始类型(uint8_t 最多为浮点数)或 char* 字符串。如果该类包装了原始类型,则将其值设置为任何原始类型将执行直接转换,而将 char* 设置为 ascii 到原始类型的转换(atoi、sprintf 等)。如果它包装了一个 char*,该类应该管理一个内部 char* 缓冲区并将原语转换为 char*。
如果我将示例限制为仅 uint32_t 值,那么这是可以处理任何原始类型的模板(省略了明显的错误检查细节):
template<typename T>
class Measurement
{
public:
Measurement();
~Measurement();
void setU32Value(uint32_t value);
void setStringValue(const char* std);
uint32_t asU32() const;
const char* asString() const;
private:
T _value;
};
template<typename T>
void Measurement<T>::setU32Value(uint32_t value)
{
_value = (T)value;
}
template<typename T>
void Measurement<T>::setStringValue(const char* value)
{
_value = (T)::atoi(value);
}
template<typename T>
uint32_t Measurement<T>::asU32() const
{
return (uint32_t)_value;
}
template<typename T>
const char* Measurement<T>::asString() const
{
ostringstream oss;
oss << _value;
return oss.str();
}
但如果我尝试 Measurement
任何人都可以提出一种方法来完成这项工作吗?
谢谢。
【问题讨论】:
-
您可能专攻
Measurement<const char*>,但您希望如何处理所有权与转换?在这种情况下使用std::string似乎更合适。 -
我的建议是将数据存储为纯字符串(即
std::string),并对非字符串的任何内容使用转换函数。 -
避免 C-cast,更喜欢
static_cast。 -
你不能有 T = const 任何东西,因为 _value 必须在构造时设置。以后不能通过函数设置。
-
@Jarod42 使用字符串无法解决问题 Measurement
会导致 asU32() {return (uint32_t)_value;} 无法编译。