0

免责声明:我知道有十几种更好的方法来实现以下内容,但我这样做是为了了解更多关于模板和成员指针的信息。我正在和他们一起玩,我想看看以下是否可行。

我想要一个用作非静态成员函数的非成员模板函数。不同的类可以自己实现它并设置函数影响哪些数据成员。

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 的简单函数。

一旦我实例化DoubleHolderor的对象IntHolder,编译就会失败并且我得到的错误是:“'*': 'int IntHolder::* '”类型的操作数非法,“'+=': 非法,左操作数有类型'int IntHolder::* '"。

我明白为什么会出现错误:add10ToMember实际上不知道应该对哪个DoubleHolderIntHolder它执行操作。add10ToMember<IntHolder, int, &IntHolder::value>不会成为实际的成员函数;它仍然只是一个对非给定IntHolder实例有影响的全局函数。

但我只是不明白写我想要的东西的正确方法是什么,如果不是这样的话。甚至可能吗?

4

0 回答 0