[英]How to store templated objects in an STL container and member function call
假設您有一個像
template<class T>
struct A {
void foo() {
// Need access to "T" here
typedef typename someTrait<T>::someType T2;
}
};
並且您想使用容器(可能是STL)“注冊”(或存儲)該類的實例(或指向它的指針),以便以后調用所有已注冊實例的foo()
方法。
由於要存儲使用不同模板參數實例化的實例( A<int>
, A<float>
,...),因此顯然不能使用std::vector
並存儲實例或指向它的指針。 我可以想象的是使該方法static
並存儲指向void foo()
函數指針,例如:
void static foo();
typedef void (* fooPtr)(void);
std::vector<fooPtr>
但是不知何故,我覺得這不是C ++ 11式的。 有沒有很好的解決方案,它引入了包裝器類?
引入基類並使用動態轉換會引入對RTTI
依賴,對嗎? 我想避免依賴RTTI
。
在C ++ 11中如何做到這一點? (我不想引入其他依賴項,例如鏈接到Boost或依賴RTTI
。)
感謝您的意見!
也許您可以只使用虛擬方法? 這也適用於C ++ 03。
struct ABase {
virtual void foo() = 0;
};
template<class T>
struct A : ABase {
virtual void foo() override {
// Access to "T" here
}
};
...
std::vector<std::unique_ptr<ABase>> vec;
vec.emplace_back(new A<int>());
vec.emplace_back(new A<float>());
for (auto& p_a : vec)
p_a->foo();
如果您實際上需要一個函數數組,則可以將std::function
與std::bind
std::vector<std::function<void()> vec;
A<int> a;
vec.push_back(std::bind(&A<int>::foo, &a)); //now a should live at least as long, as vec
// or vec.push_back(std::bind(&A<int>::foo, a)); - now a will be _copied_ to vec
foo
現在是一個成員函數( std::bind
在此處將函數“綁定”到給定變量)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.