【发布时间】:2020-08-06 06:39:26
【问题描述】:
我有一个类将 Dispatched 命令存储在队列中并稍后调用它们。命令处理器是一个模板类Encoder,它使用它的方法Encoder::Encode来处理一个命令。但它可以是成员函数,也可以是静态非成员函数。 如何绑定?
// specialization that have deduced Encoder's arguments
template <class Encoder, typename ... ArgsT>
class SerialCommunicator<Encoder, std::tuple<ArgsT...>>
{
// ...
Encoder encoder_;
std::queue<std::function<EncodeResult(QByteArray&)> commands_;
mutable std::mutex commandsMutex_;
public:
// ...
void Dispatch(ArgsT ... args)
{
std::lock_guard<std::mutex> lg{commandsMutex_};
commands_.emplace(std::bind(&Encoder::Encode, &encoder_, std::placeholers::_1,
std::forward<ArgsT>(args)...);
}
// ...
};
使用 C++17,我可以使用 if constexpr(std::is_member_function_pointer_v<&Encoder::Encode>) 块将指针传递给 Encoder,以防我们处理成员函数指针。
【问题讨论】:
-
不能用对象实例调用静态成员函数吗? -- “引用类 T [...] 的静态成员 m:[...] 成员访问表达式 E.m 或 E->m,其中 E 是分别计算为 T 或 T* 的表达式。” - - en.cppreference.com/w/cpp/language/static
-
@user202729 当然可以。但是静态函数的类型与成员函数不同。因此,您不能使用指向对象的指针调用
std::bind。