0

我有一段代码在哪里发生这样的事情

     type<X> function( args<x> g)
     {
        ...
        function2();
        .....
     } 

现在 X 可以有两种类型,即 type1 和 type2。我想将函数编写为类型函数(args g){ ...

        if X is of type1 then call function2();
        if X is of type2 then call function3();
        .....
     }

我怎么能做到这一点。我正在用 C++ 编写并在 Visual Studio 中开发。

谢谢

4

3 回答 3

1

您可以使用模板特化函数重载。例如:

template <class X>
int foo(std::vector<X> a)
{
  foo1(); 
}

template <>
int foo<int>(std::vector<int> a)
{
  foo2(); 
}

请注意,如果您只需要为少数类型专门化您的函数,最好使用函数重载。如果您有很多类似的代码,并且唯一的区别在于 1 个函数调用,则可能会使用typeid

if (typeid(X) == typeid(type1)) {
  function2()
} else if (typeid(X) == typeid(type2)) {
  function3()
}
于 2012-12-07T20:59:11.160 回答
1

注意:根据类型进行比较的代码通常表明设计不佳。

您可以使用一个具有不同签名的函数:

void my_function(const type_1& t1);
void my_function(const type_2& t2);

让编译器根据参数类型选择函数。

于 2012-12-07T21:00:08.243 回答
1

我假设 X 是一个类?您应该使用虚函数并创建 X 的派生版本。请参见下面的示例:

class X
{
public:
    virtual void myFunction(int input) { // do stuff here... }
};

class Y : public X
{
public:
    void myFunction(int input) { // do overridden stuff here... }
};

然后,如果您创建一个 X 类型的对象并在其上调用 myFunction(),那么它将运行“在这里做事”代码。如果您创建一个 Y 类型的对象并在其上调用 myFunction(),那么它将运行“在此处执行覆盖的内容”代码。但是您可以以多态方式使用您创建的任何对象,如下所示:

X *obj = NULL;

if (condition met)
{
    obj = new X();
}
else
{
    obj = new Y();
}

obj->myFunction(myInput); // will call either X or Y's myFunction() depending on what type it is
于 2012-12-07T21:01:13.407 回答