如果你不想使用升壓/ C++ 17任,考慮從基類派生的「doSometing」功能的參數,並做動態轉換到正確的類對象。在這種情況下,你可以在運行時檢查你是否有一個有效的指針。
class param{
public:
virtual ~param(){};
};
template <typename T>
struct specificParam:param{
specificParam(T p):param(p){}
T param;
};
class Foo
{
public:
virtual void doSomething(param* data) = 0;
};
template <typename T>
class Bar : public Foo
{
public:
virtual void doSomething(param* data){
specificParam<T> *p = dynamic_cast<specificParam<T> *>(data);
if (p != nullptr){
std::cout<<"Bar got:" << p->param << "\n";
}
else {
std::cout<<"Bar: parameter type error.\n";
}
}
};
int main(){
Bar<char> obj1;
Bar<int> obj2;
Bar<float> obj3;
specificParam<char> t1('a');
specificParam<int> t2(1);
specificParam<float> t3(2.2);
obj1.doSomething(&t1); //Bar got:a
obj2.doSomething(&t2); //Bar got:1
obj3.doSomething(&t3); //Bar got:2.2
// trying to access int object with float parameter
obj2.doSomething(&t3); //Bar: parameter type error.
}
最簡單的(但不安全的!)的方法是用void *指針+靜態澆鑄
class Foo
{
public:
virtual void doSomething(void* data) = 0;
};
template <typename T>
class Bar:public Foo
{
public:
virtual void doSomething(void* data){
T* pData = static_cast<T*>(data);
std::cout<<"Bar1 got:" << *pData << "\n";
}
};
int main(){
Bar<char> obj1;
Bar<int> obj2;
Bar<float> obj3;
char c = 'a';
int i = 1;
float f = 2.2;
obj1.doSomething(&c); // Bar1 got:a
obj2.doSomething(&i); // Bar1 got:1
obj3.doSomething(&f); // Bar1 got:2.2
//obj2.doSomething(&c); // Very bad!!!
}
來源
2017-09-07 08:11:57
Nir
可以請你更具體?你如何使用函數內的數據?數據類型的要求是什麼?例如。有幾個已知的類,或者你打算接受任何具有特定方法的類? – bolov
您的問題需要縮小一點。你知道類型的範圍,你想讓它們被自動推斷嗎?最簡單的答案是「使用void *」,更好的答案可能是Story Teller的答案。這一切都取決於你的用例。 –
我很好奇,看着答案,關於是否有可能實現相同的結果,而不必在'doSomething'上做任何演員。像某種方式封裝類型,而不必將'doSomething'作爲一個模板,並用'decltype',即一種虛擬工廠方法來檢索該類型... – perencia