【问题标题】:Templatized Type Find for unique_ptr<int[]>, vector<int>, and int[]unique_ptr<int[]>、vector<int> 和 int[] 的模板化类型查找
【发布时间】:2016-02-26 12:16:44
【问题描述】:

假设我有 3 个变量:

vector<int> vec(3);
int stat[3];
auto dyn = make_unique<int[]>(3);

我想创建一个模板化函数来接受所有这些,并且有一个包含类型的成员变量(在我的示例中为int)。我有一个这样的模板化函数:

template <typename T>
void foo(T& X) { vector<type> bar; }

我将把每个容器传递给这个函数。我需要一种方法来找到这个type,这对他们每个人都有效。我显然可以通过专门化模板化函数来做到这一点,但我希望有人可以为我提供一个更有说服力的解决方案。

【问题讨论】:

  • 你打算如何使用这个功能?你会用作为参数传递的容器填充函数内部的向量bar,然后对其进行一些处理吗?为什么不创建三个填充向量的特化,然后调用另一个函数来完成所有实际工作?试图将所有不同的情况塞进一个函数中似乎是个好主意,但实际上它很可能只是一个无法维护的混乱。
  • @JoachimPileborg 老实说,这纯粹是学术性的。我问了一个关于通过将这些容器传递到模板中来初始化这些容器的问题:stackoverflow.com/q/35636160/2642059 答案很短,因为我在构造后找不到dyn 的大小,所以我无法在模板化函数中初始化它们,比如那。但是到那时我已经在寻找类型方面投入了一些工作,但没有找到适用于所有三种情况的任何东西,所以我只是想看看是否真的有解决方案。

标签: c++ vector types containers metaprogramming


【解决方案1】:

您可以使用decltype

template <typename T>
void foo(T& x) {
    using type = std::decay_t<decltype(x[0])>;
    std::vector<type> bar;
    // ...
}

Demo

【讨论】:

  • 这就是我想要的,你能解释一下decay_t是怎么回事吗?因为我不明白。
  • x[0] 将是 /*const*/ int&amp; 类型。所以你必须删除参考和 cv 限定符。这是通过decay完成的。
  • 哇,所以我刚刚对其进行了测试,即使使用空向量和动态数组我们也可以做到这一点,所以我不确定我是否理解您为什么放置 [0]。我们通常不需要declval 来访问函数吗?
  • decltype 只是编译时间。您只需获取类型(因为sizeof(x[0]) 等同于sizeof(int)),在运行时不进行评估。您确实可以用std::declval&lt;T&amp;&gt;() 替换x,但它只是更冗长,而不是更清晰的IMO。 std::declval 在您没有正确类型的变量的上下文中需要,如模板参数或 r 值引用。
  • 还有 cv 限定符:std::decay_t&lt;const int&amp;&gt;intremove_reference_t&lt;const int&amp;&gt;const int
猜你喜欢
  • 2016-06-08
  • 2013-08-30
  • 2020-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
相关资源
最近更新 更多