在 class 中为非 class 重载函数起别名的 C++ 语法

C++ syntax to alias non-class overloaded function inside class

我知道我可以做 namespace FILE { using boost::filesystem::rename };,如果没有其他解决方案我会做,但想知道我是否可以将它放在 class 中,这样我就可以干了。我想创建一个名为 FILE 的 class,不需要命名空间 FILE。

// class-qualified name is required
using boost::filesystem::rename

// definition not found
void(*rename)(const path&, const path&) = boost::filesystem::rename;

// cannot determine which overloaded instance
function rename = std::mem_fn<void(const path&, const path&)>(boost::filesystem::rename);

// not an alias, creates a new function
function<void(const path&, const path&)> rename = [](const path& old_p, const path& new_p) { boost::filesystem::rename(old_p, new_p); };

// all sorts of errors
auto rename = std::mem_fn(static_cast<void()(const path&, const path&)>(&boost::filesystem::rename));

// nope!
void constexpr rename = boost::filesystem::rename

我正在尝试这样做:

class FILE {
public:
    // Would like to alias boost::filesystem::rename as rename here
};

正确的语法是什么?

如果我理解正确的话,你想在 class 中使用一个 方法,它实际上不是一个方法,而是另一个函数的某种别名。

据我所知,这在 C++ 中是做不到的。您需要有一个实际的方法或一个函数对象数据成员,它只是您所需函数的薄层。

方法几乎不增加开销(不是数据成员,所以绝对没有 space 开销,并且只包含一个调用,所以它可以简单地内联)。由于该方法不携带对象的状态,因此您应该将其设为静态:

class A {
  static void rename(const path& old_p, const path& new_p) {
      boost:fs::rename(old_p, new_p);
  }
  void rename(const path& old_p, const path& new_p, system::error_code& ec) {
     boost::fs::rename(old_p, new_p, ec);
  }
};

或:

class A {
  template <class... Args>
  static void rename(Args... args) {
     boost::fs::rename(args...); // depending on function and arguments
                                 // you might want to `std::forward`
  }
};

如果您想在 public 界面中提供 rename,您需要编写包装器:

#include <boost/filesystem.hpp>

class File {

public:
    static void rename(const boost::filesystem::path& from, const boost::filesystem::path& to) {
        boost::filesystem::rename(from, to);
    }
    static void rename(const boost::filesystem::path& from, const boost::filesystem::path& to, boost::system::error_code& ec) {
        boost::filesystem::rename(from, to, ec);
    }
};

或者,如果您还想提供相关类型以方便使用:

#include <boost/filesystem.hpp>

class File {

    using path = boost::filesystem::path;
    using error_code = boost::system::error_code;

public:
    static void rename(const path& from, const path& to) {
        boost::filesystem::rename(from, to);
    }
    static void rename(const path& from, const path& to, error_code& ec) {
        boost::filesystem::rename(from, to, ec);
    }
};