用户定义文字的模板替代
template alternative for user defined literals
我创建了一个模板 class,我想使用用户定义的文字。
我的代码:
template<int base = 10>
class MyClass
{
// class code
};
// template<int base> /* Not allowed */
MyClass<17> operator "" _G(const char* param, size_t length)
{
string temp(param, length);
return MyClass<17> (temp);
}
int main()
{
MyClass<17> A = "75AD"_G;
A.print();
}
作为我的搜索结果,我知道用户用户定义的文字是有限的,不能用于大多数模板,例如上面的模板。
是否有替代解决方案,或者在这种情况下用户定义的文字是不可能的?
注:base
可以是2
到30
。
实际上可以通过一些间接的方式实现。这个想法是将模板推导延迟到您拥有类型信息的位置。
struct MyClassCtor {
std::string param;
template<int base>
operator MyClass<base>() {
return param;
}
};
MyClassCtor operator "" _G(const char* param, size_t length)
{
return {std::string(param, length)};
}
这是 "Return Type Resolver" 成语的一个例子。
当然,请记住这意味着 auto a = 345_G
不会创建 MyClass<>
类型的变量,尽管它可以传递给任何需要一个的函数。这可能是错误或功能,具体取决于您如何看待它。
我创建了一个模板 class,我想使用用户定义的文字。
我的代码:
template<int base = 10>
class MyClass
{
// class code
};
// template<int base> /* Not allowed */
MyClass<17> operator "" _G(const char* param, size_t length)
{
string temp(param, length);
return MyClass<17> (temp);
}
int main()
{
MyClass<17> A = "75AD"_G;
A.print();
}
作为我的搜索结果,我知道用户用户定义的文字是有限的,不能用于大多数模板,例如上面的模板。
是否有替代解决方案,或者在这种情况下用户定义的文字是不可能的?
注:base
可以是2
到30
。
实际上可以通过一些间接的方式实现。这个想法是将模板推导延迟到您拥有类型信息的位置。
struct MyClassCtor {
std::string param;
template<int base>
operator MyClass<base>() {
return param;
}
};
MyClassCtor operator "" _G(const char* param, size_t length)
{
return {std::string(param, length)};
}
这是 "Return Type Resolver" 成语的一个例子。
当然,请记住这意味着 auto a = 345_G
不会创建 MyClass<>
类型的变量,尽管它可以传递给任何需要一个的函数。这可能是错误或功能,具体取决于您如何看待它。