template<bool encodeit, typename T>
std::string encap(const char* tag,T s,alignT alignement=alignDisable,bool encodeit=false){
我想基于传递的函数参数自动专门化上面的函数定义。 为什么它不起作用? (让它工作真的不好吗?)。
答案 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);
}