c++ - 检测模板化类型本身是否是模板化类型

标签 c++ templates boost types

我正在编写一个负责格式化和打印信息的方法。

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_assertstd::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,这将正确选择第二个重载,否则选择第一个重载。

Live demo

关于c++ - 检测模板化类型本身是否是模板化类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46684222/

相关文章:

c++ - 安全调用运算符 - 仅在对象不为空时调用函数

c++ - 为 Dev C++ 安装 open cv

c++ - thrift cpp示例代码编译报错

c++ - CMake 链接以 boost 。错误 LNK2005

c++ - 枚举唯一的无向路径的有效方法

c++ - 如何比较 priority_queue 中的两个元素

c++ - C++ 中如何解析嵌套模板?

templates - Go模板遍及结构的结构

php - 如何从 twig 模板调用 php 模板

multithreading - Boost:可能从任何线程解锁互斥锁吗?