繁体   English   中英

将全局模板函数实现为访问成员的成员函数

[英]Implementing a global template function as a member function that accesses members

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

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

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 添加到给定成员的简单函数。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM