是否有更简洁的方式传递可变数据?

问题描述 投票:-1回答:2

如何以更干净的方式将可变参数数据从一个函数传递到另一个函数呢?

演示代码:

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

c++ multithreading networking
2个回答
3
投票

使用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);
    ...
}

0
投票

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

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

在您的特定情况下,我将使用std::function来键入擦除处理程序。

© www.soinside.com 2019 - 2024. All rights reserved.