检测模板类型本身是模板类型

use*_*462 3 c++ templates boost types

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

有一个问题/功能boost::optional<T>,当输出到流时,只有当有值时才会输出额外的空格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("--");
}
Run Code Online (Sandbox Code Playgroud)

它有效,但它有一个问题,如果我们调用print()一个没有编译错误boost::optional.我知道static_assert并且std::is_type,但由于boost::optional本身是模板化的,我不知道如何检查它.

选项2对我来说是理想的,但问题仍然存在:如何询问代码变量boost::optional<T>是否与T无关?

Tar*_*ama 5

你可以重载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("--");
}
Run Code Online (Sandbox Code Playgroud)

如果传递a boost::optional,这将正确选择第二个重载,否则将首先重载.

现场演示