切换功能取决于#define

时间:2012-12-07 20:51:04

标签: c++ visual-studio-2010

我有一段代码就是这样的事情

     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中进行开发。

感谢

3 个答案:

答案 0 :(得分: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()
}

答案 1 :(得分:1)

注意:基于类型进行比较的代码通常表示设计不佳。

您可以使用一个具有不同签名的功能:

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

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

答案 2 :(得分: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(),那么它将在这里运行&#34; do stuff&#34;码。如果你创建一个Y类型的对象并在其上调用myFunction(),那么它将在这里运行&#34; do overridden&#34;代码而不是。但是你可以以多态方式使用你创建的任何对象,如下所示:

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