2016-05-16 44 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的情况)。相反,在编译时我会避免这种情况。 –