【问题标题】:Nested template parameters and type deduction嵌套模板参数和类型推导
【发布时间】:2015-06-14 11:56:08
【问题描述】:

您好,我正在练习模板和类型推导,想尝试制作一个带有嵌套模板参数的简单函数模板,以打印出任何 stl 容器的内容:

template <template<T, ALLOC> CONT> 
void Print(const CONT<T, ALLOC> &c) {

    for (const T &elem : c) std::cout << elem << " ";
    std::cout << std::endl;
}

还有我的测试用例:

int main() {
    std::list<int> intlist{ 1, 2, 3, 4, 5 };
    std::vector<float> floatvec{ 0.2f, 0.5f };

    Print(intlist);
    Print(floatvec);
}

但是,我收到一个编译器错误,无法推断 T 和 ALLOC 的类型。有没有办法让我编写这个函数而不必显式声明模板参数的类型?

请注意,我这里的对象是能够推断出存储在传入的 stl 容器中的类型。因此,如果在 T 中传递一个整数向量,则将推导出为 Int 类型。

【问题讨论】:

  • 模板本身甚至不应该编译。template&lt;T, ALLOC&gt; CONT 说CONT 是一个模板,它有两个类型为T 和ALLOC 的非类型模板参数。这应该会导致 T 和 ALLOC 的名称查找失败。 -- 像这样:coliru.stacked-crooked.com/a/50c8edf643ed26f0
  • 哦,而且你忘记了CONT之前的class,如果这应该是一个模板template-parameter:@987654332 @

标签: c++ templates type-deduction


【解决方案1】:

在你的情况下,你可以简单地做

template <typename CONT> 
void Print(const CONT& c) {
    for (const auto& elem : c) std::cout << elem << " ";
    std::cout << std::endl;
}

如果您想将 Print 函数限制为具有 2 个模板参数的模板类,则语法为:

template <template<typename , typename> class CONT, typename T, typename ALLOC> 
void Print(const CONT<T, ALLOC> &c) {
    for (const T &elem : c) std::cout << elem << " ";
    std::cout << std::endl;
}

【讨论】:

  • 谢谢,第一个是我一开始就有的,但我需要推断存储在 CONT 参数中的类型。因此嵌套的模板版本。这看起来相当混乱,最外层的模板参数有 3 个模板参数,CONT 类有 2 个匿名模板参数。你能解释一下我如何使用传入的模板参数显式调用 print 函数吗?我需要彻底理解这一点,尤其是类型推导部分。
  • @ChristopherLeong:stl 容器定义了一些类型来检索它们的模板参数为std::vector&lt;..&gt;::value_type。
  • 你可以用Print&lt;std::vector, float, std::allocator&lt;float&gt;&gt;(floatvec);显式调用Print
猜你喜欢
  • 2023-03-24
  • 2022-11-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-03
  • 2012-12-06
  • 2018-08-26
  • 2020-07-09
  • 1970-01-01
相关资源
最近更新 更多