我正在开发一种算法,我需要根据输入变量将一个矢量定义为实数或复数。伪就像
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 ++?我觉得不舒服,因为在我的实现中唯一的区别将是数据类型,有没有办法选择在运行时应该使用什么类型?感谢。
答案 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)
宏由预处理器使用,它是一个编译时指令,在运行时不能使用它。它假定您将定义一些内容并让编译器知道您在编译期间使用实数或复数。
您可以使用模板(如建议的那样),但是如果您希望在一个地方初始化它,然后继续使用矢量,您可以选择多个选项 -
答案 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;
}