1
Bir kapsayıcıya üye işlevlerinin bir listesini depolayabilir ve daha sonra farklı sayıda yayın varsa daha sonra onları arayabilir miyim.Çoklu yayınlarla çağrı işlevleri
Sadece küçük bir şeyi kaçırdığımı hissediyorum ama bu ne kadar uzaktayım.
template<typename T>
class RPCServer
{
public:
RPCServer(const std::string host, const int port) {}
// Store the method pointers
template<typename F>
void register_method(const T discriminant, F func) {
m_callbacks.emplace_back(discriminant,func);
}
template<typename... Args>
void run(T subject, Args... args) {
auto func = std::find(std::begin(m_callbacks), std::end(m_callbacks), subject);
if (func != std::end(m_callbacks)) {
auto res = std::get<1>(*func)(args...); // This doesn't compile
}
}
~RPCServer() = default;
private:
// Store
std::vector<std::tuple<T, boost::any>> m_callbacks;
};
class Impl
{
public:
// RPC methods
void send_data(std::string data) {}
int get_details(int input) { return 0; }
};
G/depolayan işlevler güvenle yazın üyesi bir dizi almak nasıl burada
using namespace std::placeholders;
Impl impl;
RPCServer<std::string> server("localhost",1234);
server.register_method("foo", std::bind(&Impl::send_data, impl, _1));
server.register_method("bar", std::bind(&Impl::get_details, impl, _1));
server.run("foo", "blah"s); // This should call send_data with 'blah' as a arg
auto result = server.run("bar", 1); // Call get_details passing in 1
ayarlayın.
} '? – Ronnie
Belki de bunu başarmak için polimorfizm kullanılabilir. IMHO, burada RPCServer :: run içindeki yerel FunCaller'ı kurmak ve sonra argümanları ona aktarmak için çok daha basit. – bipll
Burada: https://sourceforge.net/projects/preludecpp/ - C++ 03'te buna izin veren bir kütüphane yazıyorum. Kaldılabın aritiğinin her zaman varsayılan olarak 9'luk bir sayı ile sınırlı olduğu ciddi bir düşünceye sahip. Çeşitli cins ve işlevlerin çeşitli işlevlerini üstlenebilir ve bunları birkaç yardımcı ile eşleştirebilirsiniz. – bipll