new*_*456 9 c++ casting void-pointers
我有一个小问题:如何找出C++指针的类型?
我经常在我的控制台程序中使用一个小函数来收集输入,看起来像这样:
void query(string what-to-ask, [insert datatype here] * input)
Run Code Online (Sandbox Code Playgroud)
我想创建一个泛型表单,使用void指针,但我不能cin一个void指针,所以如何找出它的类型,所以我可以投射它?
asv*_*kau 10
你不能.
但是,一种替代方法是取消void指针,使所有内容都从公共基类派生并使用RTTI.
一个例子:
class Base
{
public:
virtual ~Base() {}
};
class Foo : public Base { /* ... */ };
void SomeFunction(Base *obj)
{
Foo *p = dynamic_cast<Foo*>(obj);
if (p)
{
// This is of type Foo, do something with it...
}
}
Run Code Online (Sandbox Code Playgroud)
与其传递 a void*,然后您需要将其强制转换为正确的类型,您应该使用一个模板函数,该函数可用于您想要读取的所有类型。
通过这种方式,您可以获得类型安全的代码,而不必为大多数输入类型编写特殊代码:
template<typename T>
void query(const string &whattoask, T &input) {
cout << whattoask << endl;
cin >> input;
cout << endl;
}
int main() {
int i;
double d;
string s;
query("An integer: ", i);
query("Floating point: ", d);
query("A word: ", s);
}
Run Code Online (Sandbox Code Playgroud)
如果我理解您的要求,那么通常的方法是创建一个支持的接口类query(string what-to-ask),然后不使用 void 指针,而是将指针传递给接口。然后您可以在该实例上调用 query()。