X kind of Data: [email address, geo address, user name]
Y kind of evaluation: [starts_with, hash, ends_with, ...etc ]
X
种数据和 Y
评估可能会导致 X*Y
数量的组合。我想要一些用于记录指向某些静态存储字符串文字的代码。 从构造函数中获取一个简单的
std::string_view
到私有成员似乎没问题,但我想防止未来的维护者提供非静态存储字符串...
注意:这似乎是 C++:构造函数仅接受字符串文字的重复,但答案是写在模板中的。
std::string
。std::string_view
指向临时数据。enum
并在日志记录中查找枚举也可以。我厌倦了在字符串中添加枚举和反向查找枚举...如果没有其他解决方案,这将是我的最终解决方案。#include <iostream>
#include <string_view>
static constexpr std::string_view EXACT = "exact";
static constexpr std::string_view PREFIX = "prefix";
class Evaluator{
public:
Evaluator(std::string_view name) : m_name(name){}
bool evaluate(std::string_view input){
// Work for lookup per input
// ...
// Logging
std::cout << m_name << "\n";
return true;
}
private:
std::string_view m_name;
};
int main(){
Evaluator exact(EXACT);
exact.evaluate("");
Evaluator prefix(PREFIX);
prefix.evaluate("");
}
static constexpr const char CEXACT[] = "exact";
static constexpr const char CPREFIX[] = "prefix";
template<const char* name>
class Evaluator{
public:
Evaluator() : m_name(name){}
bool evaluate(std::string_view input){
// Work for lookup per input
std::cout << m_name << "\n";
return true;
}
private:
std::string_view m_name;
};
使用编译时字符串实现。 这是一个包含实际字符串的对象,并且始终是
consteval
。
编写一个伪字符串视图来包装这样的编译时字符串。
第一个是模板类(以免浪费存储空间)。 第二个将具有来自所述模板类的模板构造函数,但内部只是一对指针。 您甚至可以在内部使用
string_view
,具有不同程度的 DRY 故障和/或可能的“安全漏洞”,以允许某人主动绕过类型限制。
使用看起来像:
static constexpr ct_string EXACT = "exact";
static constexpr ct_string CPREFIX = "prefix";
或
static constexpr auto EXACT = "exact"_ct;
static constexpr auto CPREFIX = "prefix"_ct;
消费时:
bool evaluate(ct_string_view input){
// Work for lookup per input
std::cout << m_name << "\n";
return true;
}
在内部,
ct_string
最终成为一个以空字符结尾的保守数组。