特定的C++模板专业化
Specific C++ template specialization
我有以下代码片段:
template <class T>
struct ServicePtr
{
std::shared_ptr<T> service;
~ServicePtr()
{
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
template <class T>
struct ServicePtrDeleter
{
void operator()(ServicePtr<T>* ref) const
{
if (ref->service.get())
{
if (IRunnable<T>* r=dynamic_cast<IRunnable<T>*>(ref->service.get()))
{
//std::cout << "Mark Thread Finished" << std::endl;
r->stop();
}
else
{
std::cout << __FILE__ << ":" << __LINE__ << std::endl;
}
}
delete ref;
}
};
template <typename T>
struct ServiceCreator
{
static std::shared_ptr< ServicePtr<T> > create()
{
std::shared_ptr< ServicePtr<T> > servicePtr(new ServicePtr<T>, ServicePtrDeleter< ServicePtr<T> >());
servicePtr->service.reset(new T);
if (IRunnable<T>* r=dynamic_cast<IRunnable<T>*>(servicePtr->service.get()))
{
r->setSelfPtr(std::dynamic_pointer_cast<IRunnable<T>>(servicePtr->service));
}
else
{
std::cout << __FILE__ << ":" << __LINE__ << std::endl;
}
return servicePtr;
}
};
具有T的ServiceCreator<T>
可以或可以不从IRunnable导出。我得到以下编译器错误(GCC 4.6.1):
In file included from /usr/lib/gcc/i686-pc-linux-gnu/4.6.1/../.. /../../include/c++/4.6.1/bits/shared_ptr.h:52:0,
from /usr/lib/gcc/i686-pc-linux-gnu/4.6.1/../../../../include/c++/4.6.1/memory:86,
from /usr/lib/gcc/i686-pc-linux-gnu/4.6.1/../../../../include/c++/4.6.1/thread:40,
from main.cc:2:
/usr/lib/gcc/i686-pc-linux-gnu/4.6.1/../../../../include/c++/4.6.1/bits/shared_ptr_base.h: In constructor 'std::__shared_count<_Lp>::__shared_count(_Ptr, _Deleter) [with _Ptr = ServicePtr<LogWriter>*, _Deleter = ServicePtrDeleter<ServicePtr<LogWriter> >, __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]':
/usr/lib/gcc/i686-pc-linux-gnu/4.6.1/../../../../include/c++/4.6.1/bits/shared_ptr_base.h:771:37: instantiated from 'std::__shared_ptr<_Tp, _Lp>::__shared_ptr(_Tp1*, _Deleter) [with _Tp1 = ServicePtr<LogWriter>, _Deleter = ServicePtrDeleter<ServicePtr<LogWriter> >, _Tp = ServicePtr<LogWriter>, __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]'
/usr/lib/gcc/i686-pc-linux-gnu/4.6.1/../../../../include/c++/4.6.1/bits/shared_ptr.h:128:37: instantiated from 'std::shared_ptr<_Tp>::shared_ptr(_Tp1*, _Deleter) [with _Tp1 = ServicePtr<LogWriter>, _Deleter = ServicePtrDeleter<ServicePtr<LogWriter> >, _Tp = ServicePtr<LogWriter>]'
ServiceCreator.h:45:102: instantiated from 'static std::shared_ptr<ServicePtr<U> > ServiceCreator<T>::create() [with T = LogWriter]'
main.cc:114:27: instantiated from here
/usr/lib/gcc/i686-pc-linux-gnu/4.6.1/../../../../include/c++/4.6.1/bits/shared_ptr_base.h:480:8: error: no match for call to '(ServicePtrDeleter<ServicePtr<LogWriter> >) (ServicePtr<LogWriter>*&)'
ServiceCreator.h:19:8: note: candidate is:
ServiceCreator.h:21:7: note: void ServicePtrDeleter<T>::operator()(ServicePtr<T>*) const [with T = ServicePtr<LogWriter>]
ServiceCreator.h:21:7: note: no known conversion for argument 1 from 'ServicePtr<LogWriter>*' to 'ServicePtr<ServicePtr<LogWriter> >*'
为什么用ServicePtr< ServicePtr<T> >
实例化ServicePtrDeleter::operator()
?我只想得到operator()
内部的T,这样我就可以测试它是否实现IRunnable
。
cc:114是auto logWriter=LogWriter::create();
,它是一个全局变量。
class LogWriter:
public ServiceCreator<LogWriter>,
public IRunnable<LogWriter>,
{
....
}
ServicePtrDeleter
在此处实例化:
std::shared_ptr< ServicePtr<T> > servicePtr(new ServicePtr<T>, ServicePtrDeleter< ServicePtr<T> >());
给ServicePtrDeleter
的模板参数是ServicePtr<T>
。
在ServicePtrDeleter
的operator()
中将模板参数替换为ServicePtr<T>
时,最终会得到一个ServicePtr< ServicePtr<T> >
参数。
您可能只是想在实例化中使用T
模板参数,因为ServicePtrDeleter
将其封装到ServicePtr
本身中:
... servicePtr(new ServicePtr<T>, ServicePtrDeleter<T>());
相关文章:
- 如何使用默认参数等选择模板专业化
- 模板化建造师专业化
- 类模板的成员功能的定义在单独的TU中完全专业化
- 部分专业化和嵌套模板
- 模板专业化可以进入我的.cpp吗?
- 别名模板的专业化 C++11 中没有开销的最佳替代方案
- 部分专业化和对标准::void_t<>的需求
- "专业化不参与超载"
- 特定好友功能专业化
- 是否可以混合使用SFINAE和模板专业化?
- 为什么在班级专业化上会出现错误?
- enable_if如何帮助选择类模板的专业化?
- std::initializer_list可以专业化吗?
- 派生类中纯虚拟基方法的专业化
- "expected a '>'"类模板专业化?
- Clang不会编译GCC会编译的模板专业化
- 我可以用clang AST从模板专业化中获得默认的模板参数吗
- 函数模板部分专业化-有什么解决方法吗
- 类模板的编译错误,但其专业化除外
- 我应该声明我的函数模板专业化还是定义它们就足够了