2016-05-16 46 views
0
template<bool encodeit, typename T> 
std::string encap(const char* tag,T s,alignT alignement=alignDisable,bool encodeit=false){ 

我想基於傳遞的函數參數自動專門化上述函數定義。 它爲什麼不起作用? (應該不是很好,讓它工作?)。關於參數值的自動模板功能專業化

+0

你可以用它這樣的..而不是定義一個變量我不知道你的意思。你想做什麼?什麼沒有工作呢? – TartanLlama

+0

您確定要同時使用模板參數'encodeit'和函數參數嗎? –

+0

我需要將參數傳遞給函數,並有2個不同的版本編譯一個用於encodeit = true,另一個用於encodeit = false(並且很多取決於T),但不是像encap 和encap 那樣使用它我想編譯器根據傳遞給該函數的常量參數進行選擇。 –

回答

0

只有在encodeIt是編譯時常量時才能使用。如果是這樣,你可以使用tag分派:

template<typename T> 
std::string encap(const char* tag, T s, std::true_type encode, 
//         tag ^^^^^^^^^^^^^^ 
        alignT alignment=alignDisable) { 
    //true version 
} 


template<typename T> 
std::string encap(const char* tag, T s, std::false_type encode, 
//         tag ^^^^^^^^^^^^^^^ 
        alignT alignment=alignDisable) { 
    //false version 
} 

然後你只需要調用是這樣的:

encap(tag, s, std::true_type{}); //calls true version 
encap(tag, s, std::false_type{}); //calls false version 

//calls true or false version depending on should_encode 
encap(tag, s, std::integral_constant<bool, should_encode>{}); 

如果你想收拾呼叫了一下,你可以換標籤調度,如建議通過納米:

template <bool Encode, typename T> 
std::string encap(const char* tag, T s, alignT alignment=alignDisable) 
{ 
    return encap(tag, s, std::integral_constant<bool, Encode>, alignment); 
} 

那麼你會叫這樣的:

encap<true>(tag, s); //calls true version 
encap<false>(tag, s); //calls false version 

//calls true or false version depending on should_encode 
encap<should_encode>(tag, s); 
+0

'encap(tag,s,std :: integral_constant {});'vs'encap (tag,s)',誰贏? –

+0

@ n.m。那麼第一個是可能的,第二個依賴於部分功能模板專門化,這不屬於該語言。所以第一個贏了。 – TartanLlama

+0

「部分功能模板專業化」nope,看不見。 –

0

我不確定通過將「true」(或)「false」作爲模板特化(或)作爲函數參數傳遞給您有什麼好處。

但是如果你的特化有它已經

#include <iostream> 

template <bool encode, class T>                                                     
void hello(T data) 
{ 
    if (encode) 
    { 
     std::cout << "encode is trus" << std::endl; 
    } 
    std::cout << "Data is " << data << std::endl; 

} 

int main() 
{ 
    hello<true,int>(5); 
    hello<false,int>(6); 
} 
+0

當與某些T一起使用時,bool總是爲false,所以它只用於某些T的true。但是代碼不會' t編譯所有情況下,因爲對於所有T,函數的所有版本都沒有(對於encodeit = true的情況)。相反,在編譯時我會避免這種情況。 –