是否可以根据c ++中的输入变量定义不同类型的变量?

时间:2013-08-05 08:27:52

标签: c++ runtime

我正在开发一种算法,我需要根据输入变量将一个矢量定义为实数或复数。伪就像

void foo(bool is_real)
{
  if (is_real)
  {
    vector< double > v; 
  }
  else vector< complex > v;
}

现在我正在编写两个不同版本的算法,如果is_real为true,我会将算法用于实例,否则,使用复杂的情况。实际上,除数据类型外,两种算法都完全相同。所以我谷歌和

#if is_real
  vector< double > v;
#else
  vector< complex > v;
#endif

但是这段代码没有编译。我正在使用linux gnu c ++ 4.7.2。我想知道宏是否仅适用于microsoft c ++?我觉得不舒服,因为在我的实现中唯一的区别将是数据类型,有没有办法选择在运行时应该使用什么类型?感谢。

4 个答案:

答案 0 :(得分:10)

如果代码完全相同,请将其设为模板:

namespace detail {
    template <typename T>
    void foo() {
        vector<T> v;
        // blah
    }
}

void foo(bool is_real)
{
  if (is_real)
  {
    detail::foo<double>();
  }
  else detail::foo<complex>();
}

答案 1 :(得分:1)

C ++模板需要在编译时知道它们的类型。在第一个示例中,类型是在运行时定义的,在C ++中是不允许的,这是一种相当静态的语言。第二个例子使用编译时条件,所以很好。

答案 2 :(得分:1)

宏由预处理器使用,它是一个编译时指令,在运行时不能使用它。它假定您将定义一些内容并让编译器知道您在编译期间使用实数或复数。

您可以使用模板(如建议的那样),但是如果您希望在一个地方初始化它,然后继续使用矢量,您可以选择多个选项 -

  1. 使用继承并使用基类的向量
  2. 有两个向量,只能使用一个(取决于输入)
  3. 将您的实数存储为复数。但这有点浪费。

答案 3 :(得分:0)

使用is_real选项可以在编译时使用-Dis_real尝试实现的目标

在运行时,您可以使用以下内容:

template<typename T>
class MyAlgorithm
{
    public:

    MyAlgorithm(/*...*/ )
    {
        /*Your initialization routine */
    }

     /* copy constructor
     copy assignment operator */

    ~MyAlgorithm(/*...*/){ /*...Other deallocation stuffs...*/ }

    private:
        std::vector<T> vec;
};

int main ()
{

    MyAlgorithm<double> m;
    MyAlgorithm<std::complex<double> > n;

      return 0;
}