想实现类Python的print函数
win7电脑
使用小熊猫c++3.1.2871
内置编译器版本MinGW-W64 GCC11.4.0 64-bit
均为debug模式编译, 参数-std=c++14 -g
在有函数print(const char x)的情况下把char字面量匹配print(T const x){...}
以及在是否使用<>指定类型时的玄学问题
代码:
#include <iostream>
template <typename T>
void print(T const t)
{
T x = t;
if(x < 0) x = -x;
if(x > 9)print(x / 10);
putchar(x % 10 + '0');
}
void print(const char x)
{
putchar(x);
}
template<typename T, typename... Args>
void print(T x, Args... args)
{
print<T>(x);
print(args...);
}
int main()
{
print('a', 0, 'b', 5);
}
输出970985
代码(唯一区别在于未使用print(x))
#include <iostream>
template <typename T>
void print(T const t)
{
T x = t;
if(x < 0) x = -x;
if(x > 9)print(x / 10);
putchar(x % 10 + '0');
}
void print(const char x)
{
putchar(x);
}
template<typename T, typename... Args>
void print(T x, Args... args)
{
print(x);
print(args...);
}
int main()
{
print('a', 0, 'b', 5);
}
输出a0b5符合预期
而对于如下代码:
template <typename T>
void print(T const t)
{
T x = t;
if(x < 0) x = -x;
if(x > 9)print(x / 10);
putchar(x % 10 + '0');
}
void print( const char* x)
{
for(size_t i = 0, end = strlen(x);i < end; i++)
{
putchar(x[i]);
}
}
template<typename T, typename... Args>
void print(T x, Args... args)
{
print(x);
print(args...);
}
int main()
{
int32_t n = 10;
print(n, "s", 5);
}
输出10s5符合预期
而仅仅调换const与char*的位置
template <typename T>
void print(T const t)
{
T x = t;
if(x < 0) x = -x;
if(x > 9)print(x / 10);
putchar(x % 10 + '0');
}
void print(char* const x)
{
for(size_t i = 0, end = strlen(x);i < end; i++)
{
putchar(x[i]);
}
}
template<typename T, typename... Args>
void print(T x, Args... args)
{
print(x);
print(args...);
}
int main()
{
int32_t n = 10;
print(n, "s", 5);
}
则编译失败, 提示
[错误] ordered comparison of pointer with integer zero ('const char*' and 'int')
而将char* const x改为char const *x
template <typename T>
void print(T const t)
{
T x = t;
if(x < 0) x = -x;
if(x > 9)print(x / 10);
putchar(x % 10 + '0');
}
void print(char const *x)
{
for(size_t i = 0, end = strlen(x);i < end; i++)
{
putchar(x[i]);
}
}
template<typename T, typename... Args>
void print(T x, Args... args)
{
print(x);
print(args...);
}
int main()
{
int32_t n = 10;
print(n, "s", 5);
}
输出10s5符合预期
求助大佬, 实在看不太懂cpp的模版匹配,望指教。