当前位置: 首页 > 知识库问答 >
问题:

通用成员函数定义,可从两个“const”实例化

武晨
2023-03-14

有没有一种方法可以定义一个既可以从“const”访问又可以从“const”访问的成员函数

我需要这个来实现list类的sList。在其中,我想声明一个函数,它将另一个函数作为参数,该函数的指针为“const”或“non-const”,指向当前的sList结构中的每个列表,并将其调用。

声明如下:

template <typename T>
struct sList
{
    sList(initializer_list<T>);

    inline void DoForEachList(auto pFunc)
    {
        for(auto p = this; p; p = p->pNext)
            pFunc(p);
    }

    ~sList();

    T dat;

    sList *pNext = nullptr;
};

我使用autopFunc,因为我也想最终传递lambda。所以现在如果我有一个这种类型的const对象并从中调用'DoForEachList'作为参数lambda函数传递,类型'auto'中有1个arg。我的编译器会失败,如下所示:

错误:传递const sList

以及调用DoForEachList的代码:

void main()
{
    extern const sList<unsigned char> cvobj;
    cvobj.DoForEachList([] (auto pCurr) {/* Do something */});
}

是否有某种方法可以这样定义DoForEachList成员函数(或成员函数的模板):

template <typename T>
struct sList
{
    inline void DoForEachList(auto pFunc) auto //either 'const' or none
    {
        for(auto p = this; p; p = pNext->pNext)
            pFunc(p);
    }

    //...
};

共有2个答案

鲁羽
2023-03-14

您应该只使用const成员函数,并使成员变量可变,这会告诉编译器/您成员不会影响类的“已更改”行为。如果不是这样,请重新考虑您的设计,因为这并不完全正确<代码>可变(code>mutable)更为正确,例如,需要修改地图的键,使其不影响该地图中的顺序,但即使这样。。。

代码示例:

struct Bla
{
    void increment() const { i++; }
private:
    mutable int i = 0;
};

int main()
{
    const Bla bla;
    bla.increment();
}

现场演示。

后源
2023-03-14
匿名用户

根据@dyp在评论中的回答:

如果要重载此的常量,确实需要两个单独的函数。但是,您可以通过将工作卸载到助手函数来最小化重复。

@dyp建议使用朋友函数模板,但朋友函数没有权限改造,所以我通常更喜欢静态成员函数;然后您可以将其设为私有或受保护:

template <typename T>
struct sList
{
    void DoForEachList(auto pFunc)
    {
        DoForEachListHelper(*this, pFunc);
    }
    void DoForEachList(auto pFunc) const
    {
        DoForEachListHelper(*this, pFunc);
    }
private:
    static void DoForEachListHelper(auto&& self, auto pFunc)
    {
        for(auto p = &self; p; p = pNext->pNext)
            pFunc(p);
    }
};

 类似资料:
  • 主要内容:const成员变量,const成员函数(常成员函数)在类中,如果你不希望某些数据被修改,可以使用 关键字加以限定。const 可以用来修饰成员变量和成员函数。 const成员变量 const 成员变量的用法和普通 const 变量的用法相似,只需要在声明时加上 const 关键字。初始化 const 成员变量只有一种方法,就是通过构造函数的初始化列表,这点在前面已经讲到了,请猛击《 C++初始化列表》回顾。 const成员函数(常成员函数) con

  • 我遇到了我不明白的情况。有人能很好地解释为什么第一个代码编译正确,而第二个代码出错: 错误:“TestClass::z”的值在常量表达式中不可用。} - ^ 注意:“int TestClass::z”不是const static int z;" 工作代码: 但是当我尝试使 静态时,我得到上述错误: 附言:我正在使用mingw32-g 4.8.1

  • 我们一直强调,最低权限原则(principle of least privilege)是良好软件工程的最基本原则之一。下面介绍这个原则如何应用于对象。 有些对象需要修改,有些不需要。程序员可以用关键字const指定对象不能修改,且修改时会产生语法错误。例如: const Time noon(12,0,0); 声明 Time 类对象 noon 为 const,并将其初始化为中午12时。 软件工程视点

  • 问题内容: 在C ++中,我可以定义一个 访问器 成员函数,该函数返回(或引用)私有数据成员的值,以便调用者无法以任何方式修改该私有数据成员。 有没有办法在Java中做到这一点? 如果是这样,怎么办? 我知道关键字但AFAIK应用于 方法 时: 防止在子类中重写/多态化该方法。 使该方法可内联。 (请参见下面@Joachim Sauer的评论) 但这并不限制该方法返回对数据成员的引用,以使调用者无

  • 我正在尝试创建一个21点模拟器。在向玩家和庄家发牌之前,我需要洗牌。是一个无效函数,是类中的卡类型。职业存储从职业中发出的牌。在游戏开始时,我需要向玩家和庄家发两张牌。当我尝试在类访问 的成员函数时,我收到错误消息“调用不带对象参数的非静态成员函数”。调用成员函数的正确方法是什么?我真的对语法感到困惑。

  • 在g中运行下面的代码将导致以下错误: 错误:将“const A”传递为“this”参数会丢弃限定符[-fpermissive] 我们在哪里使用? F允许意味着代码不一致。标准在哪里规定这是一个错误?