2017-02-20 58 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; 
}