考虑以下几点:
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中实现这一目标?有没有人有结构化代码的建议,这将允许不具有转换运算符定义的复制,但仍然有一组有限的转换运算符实例,就像它们被单独定义一样?