为模板化转换运算符指导声明

时间:2015-05-01 15:23:07

标签: c++ c++11 conversion-operator

考虑以下几点:

template <typename T> struct Foo;

template <typename S> struct Bar
{
  template <typename T> operator Foo<T>();

  // ...
};

class Baz
{
  Baz(Foo<int>&);
};

int main()
{
  Bar<float> bar;
  Baz        baz(bar); // Won't work
}

我想使用模板化运算符来指定一系列可能的转换,以避免重复代码/复制和粘贴。但是,当然,现在在注释的代码行上的一系列转换将不起作用,因为在C ++中编译器合理地不会考虑所有形式的模板化运算符,因为这将是难以处理的。

如果我改为选择剪切和粘贴,并按如下方式定义Bar:

template <typename S> struct Bar
{
  operator Foo<int>();
  operator Foo<float>();
  // many more

  // ...
};

现在可以确定并找到链式转换。我想要的是能够拥有我的蛋糕并将其吃掉,特别是将操作符定义为模板,还提供了一系列指导声明,可以像转换运算符被定义为非模板一样使用:

template <typename S> struct Bar
{
  template <typename T> operator Foo<T>();

  template operator Foo<int>(); // Not valid C++
  template operator Foo<float>(); // Not valid C++
  // ...
};

有没有办法在C ++ 11 / C ++ 14中实现这一目标?有没有人有结构化代码的建议,这将允许不具有转换运算符定义的复制,但仍然有一组有限的转换运算符实例,就像它们被单独定义一样?

0 个答案:

没有答案