如何从 mixin mixin 模板调用构造函数
How to call a constructor from a mixedin mixin template
如果我做类似的事情
mixin template T() {
float y;
this(float y_){
y = y_;
}
}
class C {
mixin T!() t;
int x;
this(int x_, float y_){
x = x_;
this(y_);
}
}
//
C c = new C(5, 7.0f);
这给出了错误
constructor C.this (int x_, float y_) is not callable using argument types (float)
。在 C 的构造函数中包含 this(y_);
的行,这似乎暗示 C 看不到从 T 导入的构造函数。虽然,它应该。
显然 t.this(...)
和 T!().this(...)
不起作用。
我能想到的最明显的解决方法是(代理):
template T(...) {
void constructor(...){...}
this(Args...)(Args args){ constructor(args); }
}
...
class C {
mixin T!() t;
this(...){
t.constructor(...);
}
}
但这很糟糕,因为它给 T 带来了更多的知识开销(使用构造函数需要做一些特殊的事情)
有什么方法可以以非奇怪(非特殊情况)的方式调用 t 的构造函数吗?另外,这是bug吗?如果不是,为什么会这样?
问题源于这样一个事实,即通过混合模板将事物混合到聚合中are not inserted into the aggregate's overload set。
对于普通方法,解决这个问题的方法是在模板混合引入的范围内使用别名,如下所示:
mixin template T()
{
void foo()
{
}
}
class C
{
mixin T!() t;
alias foo = t.foo;
void foo(int _)
{
foo();
}
}
但是,对于构造函数,模拟不起作用并且 it's a reported bug:
alias this = t.this; // Won't compile
alias __ctor = t.__ctor // Using the hidden __ctor name won't compile, either
如果你不需要从外部调用混入构造函数,你可以通过内置名称调用它:
mixin template T()
{
float y;
this(float y_)
{
y = y_;
}
}
class C
{
mixin T!() t;
int x;
this(int x_, float y_)
{
x = x_;
t.__ctor(y_); // This
}
}
如果我做类似的事情
mixin template T() {
float y;
this(float y_){
y = y_;
}
}
class C {
mixin T!() t;
int x;
this(int x_, float y_){
x = x_;
this(y_);
}
}
//
C c = new C(5, 7.0f);
这给出了错误
constructor C.this (int x_, float y_) is not callable using argument types (float)
。在 C 的构造函数中包含 this(y_);
的行,这似乎暗示 C 看不到从 T 导入的构造函数。虽然,它应该。
显然 t.this(...)
和 T!().this(...)
不起作用。
我能想到的最明显的解决方法是(代理):
template T(...) {
void constructor(...){...}
this(Args...)(Args args){ constructor(args); }
}
...
class C {
mixin T!() t;
this(...){
t.constructor(...);
}
}
但这很糟糕,因为它给 T 带来了更多的知识开销(使用构造函数需要做一些特殊的事情)
有什么方法可以以非奇怪(非特殊情况)的方式调用 t 的构造函数吗?另外,这是bug吗?如果不是,为什么会这样?
问题源于这样一个事实,即通过混合模板将事物混合到聚合中are not inserted into the aggregate's overload set。
对于普通方法,解决这个问题的方法是在模板混合引入的范围内使用别名,如下所示:
mixin template T()
{
void foo()
{
}
}
class C
{
mixin T!() t;
alias foo = t.foo;
void foo(int _)
{
foo();
}
}
但是,对于构造函数,模拟不起作用并且 it's a reported bug:
alias this = t.this; // Won't compile
alias __ctor = t.__ctor // Using the hidden __ctor name won't compile, either
如果你不需要从外部调用混入构造函数,你可以通过内置名称调用它:
mixin template T()
{
float y;
this(float y_)
{
y = y_;
}
}
class C
{
mixin T!() t;
int x;
this(int x_, float y_)
{
x = x_;
t.__ctor(y_); // This
}
}