【发布时间】:2016-07-23 22:31:48
【问题描述】:
我想创建一个应用程序,我可以在其中定义键入的问题列表,然后遍历此列表并要求用户输入答案,将它们存储在另一个列表中,然后检查答案,验证它们并提供结果。
我目前的幼稚方法是这样的:
class Question {
std::string message;
public:
Question(const std::string& msg) : message{msg} {}
std::string& getQuestion(void) const {
return this->message;
}
virtual ~Question(void) = 0;
};
Question::~Question(void) {}
template<class AnswerType>
class Prompt : public Question {
Prompt(std::string& msg) : Question{msg} {}
virtual ~Prompt(void) {}
};
class Answer<class T> {
T answ;
public:
Answer(const T& answer) : answ{answer} {}
T getAnswer(void) const {
return this->answ;
}
};
我想做类似的事情:
std::list< const Question* > whatToAsk{
new Prompt<int>{"Your age"},
new Prompt<std::string>{"Your name"},
new Prompt<float>{"Your weight"}
};
for(auto q in whatToAsk) {
Answer< "derived q template parameter" > a{};
std::cout << q->getQuestion() << ": ";
std::cin >> a;
// ... to be continued ...
}
在 std::list 中存储问题(Prompt)。
但对我来说有问题的部分是我必须使用向下转换(带有运行时检查)、虚拟函数(运行时多态性)或双重分派(同样带有运行时开销)。
我担心类型在编译期间是已知的,因为问题列表将在源代码中硬编码,我想避免运行时开销并实现编译时静态多态性。
我怎样才能做到这一点?也许是某种特征?
【问题讨论】:
-
您想创建一个对象
a,其类型将在运行时已知。我不认为这是可能的。我也认为不可能在 for 循环体内为每次迭代创建不同的类型,除非这些类型是同一继承链的一部分(运行时多态性)。
标签: c++ templates containers