在 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);
}
};
我知道我可以做 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);
}
};