如何以更干净的方式将可变参数数据从一个函数传递到另一个函数呢?
演示代码:
void * variadic_data = nullptr;
void send_1(){
if(sendto(...)){
variadic_data = static_cast<void *>(new int(123)); // from here
}
}
void send_2(){
if(sendto(...)){
variadic_data = static_cast<void *>(new std::string("test"));
}
}
void task(){
...
do {
i_result = recv(...);
std::string message(buff, i_result);
if(message == ...){
int * int_1 = static_cast<int *>(variadic_data); // to here
...
delete int_1 ;
} else if (message == ...) {
std::string * str_1 = static_cast<std::string *>(variadic_data);
...
delete str_1;
}
} while(i_result != 0 && i_result != SOCKET_ERROR);
}
我有额外的线程与recv和少数其他线程与sendto函数,许多sendto有局部变量不同,并在recv线程中的响应后需要。我认为在额外线程中阻止recv是常见的方式。这只是糟糕的应用程序设计吗?我应该创建消息管理器并在发送后立即选择吗?
使用std::variant
,例如:
std::variant<int, std::string> variadic_data;
...
variadic_data = 123;
...
variadic_data = std::string("test");
...
if (message == ...) {
int int_1 = std::get<int>(variadic_data);
...
}
else if (message == ...) {
std::string str_1 = std::get<std::string>(variadic_data);
...
}
或者,使用std::any
代替,例如:
std::any variadic_data;
...
variadic_data = 123;
// or variadic_data = std::make_any<int>(123);
...
variadic_data = std::string("test");
// or variadic_data = std::make_any<std::string>("test");
...
if (message == ...) {
int int_1 = std::any_cast<int>(variadic_data);
...
}
else if (message == ...) {
std::string str_1 = std::any_cast<std::string>(variadic_data);
...
}
是的,你通常可以使用模板功能。
在c ++ 17(或使用Boost)中,您可以使用std::any
。
在您的特定情况下,我将使用std::function
来键入擦除处理程序。