C ++语法用于别名类中的非类重载函数

时间:2015-12-01 19:18:00

标签: c++ function class alias

我知道我可以做mul_symbol如果没有其他解决办法,我会做的,但想知道我是否可以在课堂上得到它,所以我可以干。我想创建一个名为FILE的类,不需要命名空间FILE。

namespace FILE { using boost::filesystem::rename };

我正在尝试这样做:

// 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

正确的语法是什么?

2 个答案:

答案 0 :(得分:1)

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

据我所知,这不能用C ++完成。您需要一个实际的方法或一个功能对象数据成员,它只是所需功能的一个薄层。

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

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`
  }
};

答案 1 :(得分:1)

如果要在公共接口中提供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);
    }
};