2017-02-20 60 views
0

我正在使用模板重寫一個類。代碼如下所示。如何使用模板緩存(存儲)shared_ptr類?

更改是將模板添加到欄類。但是,更改後,緩存映射不起作用,因爲我無法確定實際欄類的類型。

有沒有簡單的方法來解決這個問題(例如現有的樣本/編碼模式)?

或者我需要嘗試繼承,創建一個虛擬bar_base並存儲父母shared_ptr並每次上/下投!如果是這樣,我是否需要找出模板類型爲map key?

在此先感謝。

​​

EDIT(更新): 下面是規劃的變化:

1添加模板欄類

#include <iostream> 
#include <map> 
#include <memory> 

namespace foo { 

template <typename T = std::string> 
class bar { 
    public: 
    int m_key; 
    T m_dummy; 
    bar(int key, T var) : m_key(key), m_dummy(var) {} 
}; 

// static std::map<int, std::shared_ptr<bar>> cache; 

template <typename T = std::string> 
static std::shared_ptr<bar<T>> create(int key, T var) { 
    //if (cache.find(key) != cache.end()) { 
     //std::cout << "cache used" << std::endl; 
     //return cache[key]; 
    //} 
    //else { 
     auto p = std::make_shared<bar<T>>(bar<T>(key, var)); 
     //cache[key] = p; 
     return p; 
    //} 
} 
}; 

class mystring { 
    public: 
    mystring(std::string x) { 

    } 
}; 

int main(int argc, char * argv[]) { 
    auto a = foo::create<std::string>(1, "aaa"); 
    auto b = foo::create<std::string>(1, "bbb"); 
    auto c = foo::create<std::string>(1, "ccc"); 
    auto d = foo::create<mystring>(1,mystring("ddd")); 
    return 0; 
} 

2適應緩存/創建地圖。怎麼樣?

+2

請顯示什麼是不工作,並刪除所有不相關的行(你可以刪除,但仍然產生錯誤的行) –

+1

你說這是舊的代碼?那麼更新的代碼呢? –

+0

'bar'的哪一種特殊化,'T'的類型是'foo :: create'應該創建? –

回答

0

經過谷歌搜索後,我找到了一個解決方案,希望這可以幫助誰有同樣的要求。

#include <iostream> 
#include <map> 
#include <memory> 
#include <typeindex> 
#include <typeinfo> 

namespace foo { 

class bar_base { 
}; 
template <typename T = std::string> 
class bar : public bar_base { 
    public: 
    int m_key; 
    T m_dummy; 
    bar(int key, T var) : m_key(key), m_dummy(var) {} 
}; 

static std::map<std::pair<std::type_index, int>, std::shared_ptr<bar_base>> cache; 

template <typename T = std::string> 
static std::shared_ptr<bar<T>> create(int key, T var) { 
    if (cache.find(std::pair<std::type_index, int>(typeid(T), key)) != cache.end()) { 
     std::cout << "cache used" << std::endl; 
     return std::static_pointer_cast<bar<T>>(cache[std::pair<std::type_index, int>(typeid(T), key)]); 
    } 
    else { 
     auto p = std::make_shared<bar<T>>(bar<T>(key, var)); 
     cache[std::pair<std::type_index, int>(typeid(T), key)] = p; 
     return p; 
    } 
} 
}; 

class mystring { 
    public: 
    mystring(std::string x) { 
    } 
}; 

int main(int argc, char * argv[]) { 
    auto a = foo::create<std::string>(1, "aaa"); 
    auto b = foo::create<std::wstring>(1, L"bbb"); 
    auto c = foo::create<std::string>(1, "ccc"); 
    auto d = foo::create<mystring>(1, mystring("ddd")); 
    return 0; 
}