有没有更干净的方式来传递可变参数数据?

时间:2019-02-15 19:59:01

标签: c++ multithreading networking

那么如何将可变数据从一个函数传递到另一个函数呢?

演示程序代码:

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是常见的方法。这仅仅是糟糕的应用程序设计吗?我应该创建消息管理器并在sendto之后立即选择吗?

2 个答案:

答案 0 :(得分:3)

使用std::variant,例如:

dw

或者,改用std::any,例如:

channels

答案 1 :(得分:0)

是的,通常可以使用模板功能。

在c ++ 17(或带有Boost)中,您可以使用std::any

在您的特定情况下,我将使用std::function来对处理程序进行类型擦除。