【发布时间】:2014-12-28 12:43:32
【问题描述】:
在我的项目中,在同一范围内有很多不同含义的字符串,比如:
std::string function_name = "name";
std::string hash = "0x123456";
std::string flag = "--configure";
我想通过它们的含义来区分不同的字符串,以便与函数重载一起使用:
void Process(const std::string& string_type1);
void Process(const std::string& string_type2);
显然,我必须使用不同的类型:
void Process(const StringType1& string);
void Process(const StringType2& string);
但是如何以优雅的方式实现这些类型呢?我能得到的只有这个:
class StringType1 {
std::string str_;
public:
explicit StringType1(const std::string& str) : str_(str) {}
std::string& toString() { return str_; }
};
// Same thing with StringType2, etc.
你能建议更方便的方法吗?
重命名函数没有意义,因为主要目标是不要错误地传递一种字符串类型而不是另一种:
void ProcessType1(const std::string str);
void ProcessType2(const std::string str);
std::string str1, str2, str3;
// What should I pass where?..
【问题讨论】:
-
“按含义区分不同的字符串”您能详细说明一下它们的含义吗?对我来说闻起来有点 XY 问题。
-
是的,这显然是一个 XY 问题。在这种情况下,拥有自己的类来封装数据是多余的。查看策略模式。
-
@πάνταῥεῖ 只是为了看看 - 这不是很有帮助。您是否可以将建议的模式用法扩展到答案?
-
只是
ProcessType1和ProcessType2看起来好多了。可读且简单的代码是好代码,而不是短代码。 -
为什么一个明明是数字的散列,用字符串表示?
标签: c++ c++11 syntactic-sugar