我有以下代码,
#include <iostream>
#include <tuple>
static inline void print (void)
{
;
}
template <typename Head, typename... Tail>
static inline void print (Head h, Tail... t)
{
std::cout << h << std::endl;
print(t...);
}
int main(int argc, char *argv[])
{
print("string", 42, 3.43, true, 'c');
return 0;
}
有没有办法专门针对第一种类型Head,例如bool?我正在寻找的是我需要做的正确语法。我试过添加这个额外的模板,
template <bool, typename... Tail>
static inline void print (bool h, Tail... t)
{
std::cout << "I'm a bool!" << std::endl;
print(t...);
}
无济于事。
答案 0 :(得分:8)
在C ++中,没有函数模板的部分特化。
对于C ++ 03和C ++ 11来说都是如此,对于所有函数模板都是如此,不仅仅是变量函数模板。
您可以重载该功能:
template <typename... Tail>
static inline void print (bool h, Tail... t)
{
std::cout << "I'm a bool!" << std::endl;
print(t...);
}
当第一个参数为bool
时,将使用该重载。
答案 1 :(得分:2)
函数重载就足够了,但是你需要先声明所有签名,下面的代码才能运行here,但是如果删除像here那样的bool重载声明,那么它就不会拾取。
#include <iostream>
void print (void){}
template <typename... Tail>
void print (bool b, Tail&&... t);
template <typename Head, typename... Tail>
void print (Head&& h, Tail&&... t);
template <typename Head, typename... Tail>
void print (Head&& h, Tail&&... t) {
std::cout << std::forward<Heal>(h) << " ";
print(std::forward<Tail>(t)...);
}
template <typename... Tail>
void print (bool , Tail&&... t) {
std::cout <<"bool" << " ";
print(std::forward<Tail>(t)...);
}
int main(int argc, char *argv[]) {
print("string", 42, true, 3.43, true, 'c');
return 0;
}
编辑:为真正的解决方案添加了通用参考。