我正在编写一个负责格式化和打印信息的方法。
boost::optional<T>
中存在问题/功能,这will print an extra blank space当且仅当 optional
将其输出到流时有一个值。
我可以看到两个选项:
- 使用两种不同的函数:一种是通用函数,一种是明确处理
boost::optional<T>
的函数 - 使用单个函数来检测参数是否为
boost::optional<T>
类型并进行相应处理
选项 1 可能是这样的:
template <typename T>
void print(const T& o)
{
std::cout << o << "\n";
}
template <typename T>
void print_optional(const boost::optional<T>& o)
{
if (o)
print(*o);
else
print("--");
}
它可以工作,但是如果我们调用print()
就不会出现编译错误的问题。用boost::optional
.我知道static_assert
和 std::is_type
, 但自 boost::optional
本身是模板化的我不知道如何检查它。
选项 2 对我来说是理想的选择,但问题仍然存在:如何询问代码变量是否为 boost::optional<T>
不管 T?
最佳答案
您可以重载 print
函数:
template <typename T>
void print(const T& o)
{
std::cout << o << "\n";
}
template <typename T>
void print(const boost::optional<T>& o)
{
if (o)
print(*o);
else
print("--");
}
如果您传递 boost::optional
,这将正确选择第二个重载,否则选择第一个重载。
关于c++ - 检测模板化类型本身是否是模板化类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46684222/