template<bool encodeit, typename T>
std::string encap(const char* tag,T s,alignT alignement=alignDisable,bool encodeit=false){
我想基於傳遞的函數參數自動專門化上述函數定義。 它爲什麼不起作用? (應該不是很好,讓它工作?)。關於參數值的自動模板功能專業化
template<bool encodeit, typename T>
std::string encap(const char* tag,T s,alignT alignement=alignDisable,bool encodeit=false){
我想基於傳遞的函數參數自動專門化上述函數定義。 它爲什麼不起作用? (應該不是很好,讓它工作?)。關於參數值的自動模板功能專業化
只有在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);
'encap(tag,s,std :: integral_constant
@ n.m。那麼第一個是可能的,第二個依賴於部分功能模板專門化,這不屬於該語言。所以第一個贏了。 – TartanLlama
「部分功能模板專業化」nope,看不見。 –
我不確定通過將「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);
}
當與某些T一起使用時,bool總是爲false,所以它只用於某些T的true。但是代碼不會' t編譯所有情況下,因爲對於所有T,函數的所有版本都沒有(對於encodeit = true的情況)。相反,在編譯時我會避免這種情況。 –
你可以用它這樣的..而不是定義一個變量我不知道你的意思。你想做什麼?什麼沒有工作呢? – TartanLlama
您確定要同時使用模板參數'encodeit'和函數參數嗎? –
我需要將參數傳遞給函數,並有2個不同的版本編譯一個用於encodeit = true,另一個用於encodeit = false(並且很多取決於T),但不是像encap和encap 那樣使用它我想編譯器根據傳遞給該函數的常量參數進行選擇。 –