1

我的问题与 C++ 函数中的参数有关。有时,您可能期望一个函数可以接受不同类型的参数,据我所知,这可以通过两种方式实现。一种是使用C++新特性:函数重载(多态),另一种是使用'C'函数方式,如下例所示:

struct type0
{
    int a;
};

struct type1
{
    int a;
    int b;
};

struct type2
{
    int a;
    int b;
    int c;
};

void fun(int type, void *arg_structure)
{
    switch (type)
    {
    case 0:
        {
            struct type0 *mytype = (struct type0 *)(arg_structure);
            cout<<"a = "<<mytype->a<<endl;
            break;
        }

    case 1:
        {
            struct type1 * mytype= (struct type1 *)(arg_structure);
            cout<<"b = "<<mytype->b<<endl;
            break;
        }
    case 2:
        {
            struct type2 *mytype = (struct type2 *)(arg_structure);
            cout<<"c = "<<mytype->c<<endl;
            break;
        }
    default:
        break;
    }
}

int main () 
{
    struct type2 temp;
    temp.a = 1;
    temp.b = 2;
    temp.c = 3;
    fun(2,(void*)(&temp));

    return 0;
}

我的问题是:还有其他方法可以在 C++ 中获得可变的函数参数结构吗?谢谢!

4

3 回答 3

5

当您要求“可变参数结构”而不是“可变参数类型”时,我假设您要求在参数类型和数量方面具有灵活性。

如果是这样,您可以使用可变参数函数

void fn ( int cnt_params, ... ) {...}

或者,如果您有支持 C++11 的编译器,可变参数模板

template <typename T, typename ...P>
void fn (T t, P ...p) {....}

否则,您可以使用其他人已经建议的重载或模板。

于 2012-10-02T09:24:01.637 回答
3

C++中有几种方法可以将不同类型的参数传递给同一个函数。首先,您必须决定何时确定参数的实际类型——在编译时还是在运行时?根据此决定,您可以使用适当的方法来传递它:

对于编译时(静态)参数类型

这些方法是类型安全的,必须优先使用。

对于运行时(动态)参数类型

我想推荐使用boost::variantboost::any他们提供的类型安全。其他方法不是类型安全的,通常被认为是糟糕的设计决策。除非你真的需要,否则不要使用它们——或者更好地改进你的设计以避免它。

于 2012-10-02T10:09:57.920 回答
1

你混淆了一些事情。函数重载与多态完全不同。

还有另一种 c 方式是变量参数列表。在这里举例说明。我相信printf()兄弟情谊是使用这种机制实现的。

c++您可以使用几乎任何容器,例如std::vector或设置来代替数组,std::map<string,Type>对于命名参数也可能很好。

如果您需要一组混合类型,您可以使用 boost tuples(如果需要,可以重载)。

c++模板机制可能有用。

我认为标准容器、元组、模板和重载以及它们的组合涵盖了处理参数的 99% 的用例。

于 2012-10-02T09:32:43.087 回答