免责声明:我知道有十几种更好的方法来实现以下内容,但我这样做是为了了解更多关于模板和成员指针的信息。我正在和他们一起玩,我想看看以下是否可行。
我想要一个用作非静态成员函数的非成员模板函数。不同的类可以自己实现它并设置函数影响哪些数据成员。
template <typename T, typename Y, Y T::* P>
void add10ToMember() {
*P += static_cast<Y>(10);
}
struct DoubleHolder
{
double value{ 0.0 };
void(&add10)(void) =
add10ToMember<DoubleHolder, double, &DoubleHolder::value>;
};
struct IntHolder
{
int value{ 0 };
void(&add10)(void) =
add10ToMember<IntHolder, int, &IntHolder::value>;
};
在示例中,我制作了模板函数add10ToMember
,这是一个将给定成员加 10 的简单函数。
一旦我实例化DoubleHolder
or的对象IntHolder
,编译就会失败并且我得到的错误是:“'*': 'int IntHolder::* '”类型的操作数非法,“'+=': 非法,左操作数有类型'int IntHolder::* '"。
我明白为什么会出现错误:add10ToMember
实际上不知道应该对哪个DoubleHolder
或IntHolder
它执行操作。add10ToMember<IntHolder, int, &IntHolder::value>
不会成为实际的成员函数;它仍然只是一个对非给定IntHolder
实例有影响的全局函数。
但我只是不明白写我想要的东西的正确方法是什么,如果不是这样的话。甚至可能吗?