2014-03-14 61 views
0

我有下面的代碼,如何使用可變參數模板處理模板專業化?

#include <iostream> 
#include <tuple> 

static inline void print (void) 
{ 
    ; 
} 

template <typename Head, typename... Tail> 
static inline void print (Head h, Tail... t) 
{ 
    std::cout << h << std::endl; 
    print(t...); 
} 

int main(int argc, char *argv[]) 
{ 

    print("string", 42, 3.43, true, 'c'); 

    return 0; 
} 

有沒有一種方法,專門針對第一類,頭,用,例如,一個布爾值?我正在尋找的是我需要這樣做的正確語法。我曾嘗試添加這個額外的模板,

template <bool, typename... Tail> 
static inline void print (bool h, Tail... t) 
{ 
    std::cout << "I'm a bool!" << std::endl; 
    print(t...); 
} 

無濟於事。

回答

8

在C++中,不存在功能模板的部分特化。

這對於C++ 03和C++ 11來說都是如此,並且對於所有函數模板而言都是如此,而不僅僅是可變參數。

你可以儘管重載功能:當第一個參數是bool

template <typename... Tail> 
static inline void print (bool h, Tail... t) 
{ 
    std::cout << "I'm a bool!" << std::endl; 
    print(t...); 
} 

這超載將被使用。

2

功能超載是足夠的,但你必須先聲明所有的簽名,下面的代碼工作here,但如果你像卸下了here布爾超載的聲明,那麼它不會被拾起。

#include <iostream> 

void print (void){} 
template <typename... Tail> 
void print (bool b, Tail&&... t); 
template <typename Head, typename... Tail> 
void print (Head&& h, Tail&&... t); 


template <typename Head, typename... Tail> 
void print (Head&& h, Tail&&... t) { 
    std::cout << std::forward<Heal>(h) << " "; 
    print(std::forward<Tail>(t)...); 
} 

template <typename... Tail> 
void print (bool , Tail&&... t) { 
    std::cout <<"bool" << " "; 
    print(std::forward<Tail>(t)...); 
} 

int main(int argc, char *argv[]) { 
    print("string", 42, true, 3.43, true, 'c'); 
    return 0; 
} 

編輯:增加了一個真正的解決方案的通用參考。