C++ 用一个参数重载一个 friend class 函数参数
C++ overloading a friend class function parameter with an argument
我不确定术语重载是否适用于此,但我想做的是继承一个 class 然后调用它的不带任何参数的成员函数,以便自动继承该参数来自当前 class 成员变量。用代码更容易解释,所以我将 post 放在这里:
#include <iostream>
template <typename T>
struct Singleton {
static T & Instance() {
static T instance;
return instance;
}
T * operator -> () const {
return &Instance();
}
};
struct SFoo : Singleton<SFoo> {
void Print( int a = 0 ) {
printf( "%d\n", a );
}
};
struct SBar : SFoo {
const static int b = 42;
friend void Print( int a = b); // <- Should call SFoo::Print() with integer b as the argument
};
int main() {
using Foo = Singleton<SFoo>;
using Bar = Singleton<SBar>;
Foo()->Print( 123 ); // Should print: 123
Bar()->Print(); // Should print: 42
getchar();
return 0;
}
我对继承比较陌生,似乎无法理解这么简单的一段代码。现在在打印 123
和 0
(SFoo::Print()
的默认参数)时产生结果,这不是预期的。
void Print(int a = b) { SFoo::Print(a); }
让它发挥作用,正如您所指出的,它也可以是:
void Print() { SFoo::Print(b); }
因为我们不需要两个接受 int
.
的版本
另一方面,您声明了一个 friend
(这是一个非成员函数)。它没有在程序中的任何地方调用(Bar()->Print();
调用 SFoo::Print
),并且您没有因为缺少定义而收到链接器错误。
我不确定术语重载是否适用于此,但我想做的是继承一个 class 然后调用它的不带任何参数的成员函数,以便自动继承该参数来自当前 class 成员变量。用代码更容易解释,所以我将 post 放在这里:
#include <iostream>
template <typename T>
struct Singleton {
static T & Instance() {
static T instance;
return instance;
}
T * operator -> () const {
return &Instance();
}
};
struct SFoo : Singleton<SFoo> {
void Print( int a = 0 ) {
printf( "%d\n", a );
}
};
struct SBar : SFoo {
const static int b = 42;
friend void Print( int a = b); // <- Should call SFoo::Print() with integer b as the argument
};
int main() {
using Foo = Singleton<SFoo>;
using Bar = Singleton<SBar>;
Foo()->Print( 123 ); // Should print: 123
Bar()->Print(); // Should print: 42
getchar();
return 0;
}
我对继承比较陌生,似乎无法理解这么简单的一段代码。现在在打印 123
和 0
(SFoo::Print()
的默认参数)时产生结果,这不是预期的。
void Print(int a = b) { SFoo::Print(a); }
让它发挥作用,正如您所指出的,它也可以是:
void Print() { SFoo::Print(b); }
因为我们不需要两个接受 int
.
另一方面,您声明了一个 friend
(这是一个非成员函数)。它没有在程序中的任何地方调用(Bar()->Print();
调用 SFoo::Print
),并且您没有因为缺少定义而收到链接器错误。