2011-03-15 165 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