2016-08-18 82 views
4

我有一些可變參數模板方法,它看起來像這樣:C++可變參數模板方法專業化

template<typename ... Args> 
    void Invoke(const char* funcName, Args ... args) const; 

    template<typename ... Args> 
    void Invoke(const char* funcName, Args ... args) const 
    { 
     SPrimitive params[] = { args ... }; 
     SomeOtherInvoke(funcName, params, sizeof ... (Args)); 
    } 

這裏SPrimitive - 只是一個簡單的結構與任何原始類型的構造函數。

我想爲一些複雜類型再做一個Invoke定義。這裏是我的問題: 是否有可能在C++ 11/14中創建可變參數模板方法專業化? 我的意思是這樣(爲簡單起見讓我喜歡的類型將是int):

template<int ... Args> 
    void Invoke(const char* funcName, Args ... args) 
    { 
     int params[] = { args ... }; 
     SomeComplexInvoke(funcName, params, sizeof ... (Args)); 
    } 

在這裏,我希望有一個專業化,這需要int類型的任何參數算的,所以我可以調用它,就像這樣:

Invoke("method", 2, 4 ,9); 
+2

不是專業化,但你可以與超載和SFINAE。 – Jarod42

+0

但'std :: initializer_list '似乎更合適(使用'Invoke(「method」{2,4,9})'語法)。 – Jarod42

回答

4

作爲@ Jarod42提到,它不應該與專業化。在您的例子中,你想要的東西,特別的,如果所有的參數類型是int,讓我們寫一個模板,將檢查:

template<typename ref, typename t, typename ...types> 
struct all_same { 
     static constexpr bool value = std::is_same<ref, t>::value && all_same<ref, types...>::value; 
}; 

template<typename ref, typename t> 
struct all_same<ref, t> { 
     static constexpr bool value = std::is_same<ref, t>::value; 
}; 

它檢查第一類參數是否等於所有其他類型的參數。

template<typename ... Args> 
void Invoke(const char* funcName, Args ... args) 
{ 
    using params_type = typename std::conditional<all_same<int, Args...>::value, int, SPrimitive>::type; 
    params_type params[] = { args ... }; 
    SomeOtherInvoke(funcName, params, sizeof ... (Args)); 
} 

現在演示的緣故,讓我們定義:然後在Invoke,我們應該根據args...類型選擇params

struct SPrimitive{ 
}; 

void SomeOtherInvoke(const char*, SPrimitive*, size_t) { 
     std::cout << "Invoked for SPrimitive\n"; 
} 

void SomeOtherInvoke(const char*, int*, size_t) { 
     std::cout << "Invoked for int\n"; 
} 

,並呼籲

Invoke("foo", SPrimitive()); 
Invoke("foo", SPrimitive(), SPrimitive()); 
Invoke("foo", 1, 2, 3, 4); 

輸出是:

Invoked for SPrimitive 
Invoked for SPrimitive 
Invoked for int 

這就是你要求的。

+0

謝謝,它正是我正在尋找的! – Michael