4

我创建了一个模板类,我想使用用户定义的文字。

我的代码:

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可以230

4

1 回答 1

9

这实际上是可能的,有点间接。这个想法是将模板推导延迟到您拥有类型信息的位置。

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)};
}

这是“返回类型解析器”习语的一个例子。

当然,请记住这意味着它auto a = 345_G不会创建MyClass<>类型变量,尽管它可以传递给任何需要一个类型的函数。这可能是一个错误或一个功能,这取决于你如何看待它。

于 2017-05-23T06:04:30.353 回答