为静态 class 方法定义友元函数?

Define a friend function for a static class method?

有人知道如何让外界访问私有静态方法吗?我能想到的唯一方法是通过朋友功能,但这似乎行不通。

头文件在这里:

#pragma once

#include <iostream>

class MyClass {
 public:
    friend void AtFork();

 private:
    static void Disp() { std::cout << "hello world" << std::endl; }
};

在此处实现文件:

#include "test.h"

namespace {

void AtFork() {
    MyClass::Disp();
}

}

int main() {
    AtFork();
}

错误信息是:

test.cc:6:11: error: 'Disp' is a private member of 'MyClass'
        MyClass::Disp();
                 ^
./test.h:10:15: note: declared private here
        static void Disp() { std::cout << "hello world" << std::endl; }

上下文:为了获得 fork-safe(由于一堆遗留代码),我通过绑定 fork 钩子重新初始化了第三个库,我认为它不应该暴露给 public.

上面的例子,让AtFork可以调用MyClass::Disp

您的代码中的问题是匿名命名空间。 main.cpp 中的 AtFork 只能在 main.cpp 内访问。您声明为朋友的 AtFork 是不同的。不要使用匿名命名空间,代码可以正常编译:

#include <iostream>

class MyClass {
 public:
    friend void AtFork();

 private:
    static void Disp() { std::cout << "hello world" << std::endl; }
};


//namespace {

void AtFork() {
    MyClass::Disp();
}

//}

int main() {
    AtFork();
}

尽管您可以根据需要将 AtFork 放在(命名的)命名空间中:

#include <iostream>


namespace foo { void AtFork();}

class MyClass {
 public:
    friend void foo::AtFork();

 private:
    static void Disp() { std::cout << "hello world" << std::endl; }
};


namespace foo{

void AtFork() {
    MyClass::Disp();
}

}

int main() {
    foo::AtFork();
}