2011-03-15 103 views
2
class FooInterface { 
    virtual void toggle() = 0; 
}; 

template <class TYPE, class CONFIG> 
class Foo : public FooInterface { 
    virtual void toggle(); 

    TYPE value_; 
}; 

template <> 
void Foo<bool, class CONFIG>::toggle() { 
    if (CONFIG::canToggle()) 
    value_ = !value_; 
} 

struct MyConfig { 
    static bool canToggle() { 
    return false; 
    } 
}; 

int main() { 
    Foo<bool, MyConfig> foo; 
} 

这是我正在处理的准确近似值。我基本上想要有一个专门的方法来处理类型,同时保持通用的CONFIG。因此,举例来说,我可能有十几个不同的美孚::切换()方法与专门的代码处理特定类型,但什么是从CONFIG使用将是在所有的这些方法是一致的。部分模板专业化问题

问题是以前的代码不能编译,以及几种不同的组合,我希望有一些帮助找到不同的解决方案或一些解决方法,使当前的工作。

编辑:我应该注意到,以前的代码没有CONFIG模板参数。

+0

如果你专门一个参数,你还是应该在'模板<类CONFIG>'另外一个。 – 2011-03-15 21:38:46

回答

0

调度

template<class CONFIG, class C> 
void toggle_impl(type<bool>, C &c) { 
    if (CONFIG::canToggle()) 
    c.value_ = !c.value_; 
} 

template <class TYPE, class CONFIG> 
class Foo : public FooInterface { 
    virtual void toggle() { 
     toggle_impl<CONFIG>(type<TYPE>(), *this); 
    } 
    TYPE value_; 
}; 
+0

老实说,这是最好的解决方案。专门为不同类型的数十个专业只需要一种方法的类将是一场噩梦。我希望我能想到这一点。 – user239201 2011-03-15 21:42:52

2

你需要部分专门化整个班级。你不能专门化个别成员函数。

template <class CONFIG> 
class Foo<bool, CONFIG> : public FooInterface 
{ 
    virtual void toggle(); 
    bool value_; 
}; 

template <class CONFIG> 
inline void Foo<bool, CONFIG>::toggle() 
{ 
    if (CONFIG::canToggle()) 
    value_ = !value_; 
} 
+0

是的,只是修正了这个问题。 :-) – 2011-03-15 21:34:49

+0

这就是我得到的复制粘贴代码;) – 2011-03-15 21:44:18