2011-10-02 125 views
3

可變參數模板的概念對我來說非常混亂,我想使它更復雜一些(嗯,我認爲...)。
讓我們看看下面的代碼:C++ variadic函數模板

template <typename T> 
class base 
{ 
    template <typename... E> 
    virtual void variadic_method_here(E... args) = 0; 
}; 

和實現類:

class derive : public base<some_object> 
{ 
    void variadic_method_here(concrete_args_here); 
}; 

我該怎麼辦呢?

+8

據我所知,模板不能是虛擬的,可變的或不可以的。 – UncleBens

+0

@pmr - 沒有意識到我可以做到這一點。我幾乎從不閱讀常見問題解答和入門指南。 Thnx =) –

+1

@RoyiFreifeld這也可以解釋你爲什麼試圖做某些語言禁止的事情。 :) – pmr

回答

4

我想如果我遇到了這個問題,我會用CRTP和重載來解決這個問題。

例如爲:

#include <iostream> 

template <typename Impl> 
class base { 
public: 
    template <typename... E> 
    void foo(E... args) { 
     Impl::foo_real(args...); 
    } 
}; 

class derived : public base<derived> { 
public: 
    static void foo_real(double, double) { 
    std::cout << "Two doubles" << std::endl; 
    } 

    static void foo_real(char) { 
    std::cout << "Char" << std::endl; 
    } 
}; 

int main() { 
    derived bar; 
    bar.foo(1.0,1.0); 
    bar.foo('h'); 
} 
+1

其中仍然存在運行時多態性OP的問題顯然是針對性的。 – pmr

+3

@pmr - 他們沒有特別要求運行時多態 - 對我來說,他們似乎想要編譯時多態,但不知道CRTP – Flexo

+1

你可能是對的。 OPs代碼中的'虛擬'可能是一個不太明智的決定。 – pmr

4

你不能有一個模板虛擬功能。

+1

匿名downvoter:請始終指出你爲什麼downvote。我必須猜測,你認爲(錯誤地)這沒有回答OP的問題。這當然是正確的,它直接關係到OP的代碼。我最不願意幫助人們的一個原因是,這個地方變成了網絡上的#1 Herb Schildt網站。其中一個主要原因是,恕我直言,是像你的那樣無情和/或社會低落。技術討論不是民主。投票不會勝過邏輯或事實 - 除了SO。 –