【发布时间】:2019-12-01 19:06:17
【问题描述】:
我正在尝试对值调用模板化函数,但我想调用来自潜在派生类型的函数的模板化版本。在typeid 期间,已确定类型为Dog,但任何转换尝试都失败了。如何调用模板化的派生类型WriteData函数?
关于示例
-
WriteData函数是模板化的,即使在本示例中未使用该值,因为我做了一个小示例。 - 并不总是知道
Array参数将是Animal。
#include <iostream>
using namespace std;
struct Writer {
void Write(char* data) {
cout << data << endl;
}
};
template<typename Type>
struct Array {
Type Data[2];
template<typename Formatter>
void WriteData(Formatter formatter) {
cout << "Data[0](typeid): " << typeid(*Data[0]).name() << endl;
cout << "Data[1](typeid): " << typeid(*Data[1]).name() << endl;
Data[0]->WriteData(formatter); // "Animal is doing something"
Data[1]->WriteData(formatter); // "Dog is doing something"
auto data1cast = reinterpret_cast<decltype(Data[1])>(Data[1]);
cout << "data1cast(typeidformatter " << typeid(*data1cast).name() << endl; // data1cast(typeid): class Dog
(*data1cast).WriteData(formatter); // "Animal is doing something"
((Dog*)Data[1])->WriteData(formatter); // "Dog is doing something"
}
};
struct Animal {
virtual ~Animal() = default;
template<typename Formatter>
void WriteData(Formatter formatter) {
formatter.Write("Animal is doing something");
}
};
struct Dog : Animal {
template<typename Formatter>
void WriteData(Formatter formatter) {
formatter.Write("Dog is doing something");
}
};
int main(void) {
Array<Animal*> arr;
arr.Data[0] = new Animal();
arr.Data[1] = new Dog();
Writer writer;
arr.WriteData(writer);
system("PAUSE");
return 0;
}
输出
Data[0](typeid): struct Animal
Data[1](typeid): struct Dog
Animal is doing something
Animal is doing something
data1cast(typeid): struct Dog
Animal is doing something
Dog is doing something
【问题讨论】:
标签: c++ c++11 templates c++14 decltype