参数值的自动模板功能专业化

时间:2016-05-16 08:23:52

标签: c++ templates

template<bool encodeit, typename T>
std::string encap(const char* tag,T s,alignT alignement=alignDisable,bool encodeit=false){

我想基于传递的函数参数自动专门化上面的函数定义。 为什么它不起作用? (让它工作真的不好吗?)。

2 个答案:

答案 0 :(得分:0)

仅当encodeIt是编译时常量时才能使用。如果是这样,您可以使用标签调度:

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>{}); 

如果你想稍微整理一下调用,可以按照n.m。的建议包装标签调度:

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); 

答案 1 :(得分:0)

我不确定通过&#34; true&#34;你有什么好处? (或)&#34; false&#34;作为模板特化(或)作为函数参数。

但你可以像这样使用它......而不是定义一个变量,如果你的specned已经已经

#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);
}