我有这个仿函数:
struct functor
{
template<class T> void operator()(T value) // (*)
{
// process the value
}
template<> void operator()<const wchar_t *>(const wchar_t *value) // (**)
{
if (value)
{
// process the value
}
}
template<> void operator()<const char *>(const char *value) // (**)
{
if (value)
{
// process the value
}
}
template<> void operator()<wchar_t *>(wchar_t *value) // (**)
{
if (value)
{
// process the value
}
}
template<> void operator()<char *>(char *value) // (**)
{
if (value)
{
// process the value
}
}
};
如您所见,我有4个相同的模板专精。是否有一种技术可以指定所有这些类型,这意味着以某种方式将所有可能的类型划分为主组(*)和专用组(**)?
感谢。
修改
哎呀,修了一些拼写错误。
答案 0 :(得分:3)
您可以使用更简单的方案 - 超载!
template<class T>
void foo(T value){ // general
// ...
}
template<class T>
void foo(T* value){ // for pointers!
if(value)
foo(*value); // forward to general implementation
}
此外,如果您不需要修改参数,我建议将参数设为引用 - const
(或者两者都有,具体取决于您实际需要做的事情):
template<class T>
void foo(T& value){ // general, may modify parameter
// ...
}
template<class T>
void foo(T const& value){ // general, will not modify parameter
// ...
}
如果你想为某组类型设置一个特殊的实现(即整个集合的一个实现),traits和tag dispatching可以帮助你:
// dispatch tags
struct non_ABC_tag{};
struct ABC_tag{};
class A; class B; class C;
template<class T>
struct get_tag{
typedef non_ABC_tag type;
};
// specialization on the members of the set
template<> struct get_tag<A>{ typedef ABC_tag type; };
template<> struct get_tag<B>{ typedef ABC_tag type; };
template<> struct get_tag<C>{ typedef ABC_tag type; };
// again, consider references for 'value' - see above
template<class T>
void foo(T value, non_ABC_tag){
// not A, B or C ...
}
template<class T>
void foo(T value, ABC_tag){
// A, B, or C ...
}
template<class T>
void foo(T value){
foo(value, typename get_tag<T>::type()); // dispatch
}
最重要的是,如果你想对没有任何共同点的类型进行分组,你至少需要一些重复(标签,重载......)。
答案 1 :(得分:1)
你的意思是这样吗?
struct functor
{
template<class T> void operator()(T value)
{
// process the value
}
template<class T> void operator()(T* value) // overload, not specialization
{
if (value) {
// process the value
}
}
};
如果您只想要那些类型,那么
struct functor
{
protected:
template<class T> void special(T* value) // overload, not specialization
{
if (value) {
// process the value
}
}
public
template<class T> void operator()(T value)
{
// process the value
}
void operator()(char* value) {special(value);}
void operator()(wchar_t* value) {special(value);}
void operator()(const char* value) {special(value);}
void operator()(const wchar_t* value) {special(value);}
};