基本上,根据用户是否输入0或1作为命令行参数,我希望我的数据类有一个向量或一个数组(静态)作为其数据成员。我不相信你可以在.h文件中添加if语句,但我想做以下事情:
/*A.h*/
//various functions
private:
if(argv[1] == 0)
vector b;
else if(argv[1] == 1)
array b[10];
有一种简单的方法吗?谢谢!
答案 0 :(得分:3)
C类型数组和std :: vector有非常不同的接口,所以即使你能够这样做,编写有意义的代码也很困难,因为vector有push_back(),empty()等,和数组没有。
您正在寻找的是具有一致接口的一种对象类型,它可以在引擎盖下具有多个实现(可以使用C样式数组或C ++标准向量来实现)。这称为多态,可以在此处找到如何使用C ++实现此目的的教程:http://www.cplusplus.com/doc/tutorial/polymorphism/
答案 1 :(得分:0)
实现这一目标的一种方法是使用模板助手功能。但请注意,如果代码很复杂,这可能会导致代码重复。但正如我想的那样,对于不同实现方法的性能测量这样的事情(为什么程序用户会关心它是如何实现的),我想这个代码并不太复杂。
例如:
template<typename type_to_use> int template_main(int argc, char* argv[])
{
type_to_use b;
// ...
}
int main(int argc, char* argv[])
{
if (argv[1]==0)
template_main<vector>(argc, argv);
else
template_main<int[10]>(argc, argv);
}
答案 2 :(得分:0)
有一种简单的方法吗?
是:您使用由基类定义的公共接口创建两个不同的实现。然后,使用类工厂根据运行时参数实例化其中一个。
class data {
public:
virtual ~data() = 0;
// define public interface here
};
class vector_data: public data {
std::vector<int> values;
public:
// implement public interface here in terms of values
};
class array_data: public data {
int values[20]; // or, std::array<int, 10> values;
public:
// implement public interface here in terms of values
};
std::unique_ptr<data> make_data(bool vector_data)
{
if(vector_data)
return { new vector_data() };
return { new array_data(); }
}
int main(int argc, char* argv[])
{
std::vector<std::string> args{ argv, argv + argc };
auto data = make_data( args[1] == "vector" };
}
只有在您调用时才会将数据实例化为矢量数据:
> application.exe vector