簡體   English   中英

如何在STL容器和成員函數調用中存儲模板化對象

[英]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::functionstd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM