c++ - 当函数返回由模板类型和另一个类型组成的类型时,模板参数推导

标签 c++ templates metaprogramming template-meta-programming c++17

这个标题很难用文字表达,但这是我试图用不可编译的代码实现的:

template<template <typename> class Container>
Container<int> foo() {
    return Container<int>{1,2,3};
}

int main() {
    auto bar = foo<std::vector>();
    return 0;
}

基本上我想要一个模板函数,它可以从传递给它的类型和以前已知的类型(在本例中为 int)“组合”其返回类型。在这种情况下,我想要一个函数,该函数在调用者指定的容器内返回任意数据类型。 (我所说的任意并不是指编译时随机或不确定,而是调用者没有关于数据类型的“输入”,这是在函数本身内部确定的)。

这种类型的事情甚至可以通过 std+1z 的 clang 或 gcc 实现吗?我错过了一些非常明显的东西吗?是否有我不知道的跨越数百个字符的“1 行”解决方案?

我在这里看到过各种类似的例子,但它们似乎都假定函数将指针或引用作为参数并填充这些容器。

最佳答案

你唯一的麻烦是std::vector 不是 template <typename> class .这是一个template <typename T, typename Alloc> class这恰好有第二个模板参数的默认参数。

解决这个问题的一种方法是使用一个真正只接受一个参数的别名模板:

#include <vector>

template<template <typename> class Container>
Container<int> foo() {
    return Container<int>{1,2,3};
}

template <typename T>
using Vec = std::vector<T>;

int main() {
    auto bar = foo<Vec>();
    return 0;
}

评论中推荐的另一种方法是在声明原始函数的模板时使用可变类型名,它接受任何仅采用类型参数的类模板。然后你可以只用一个参数实例化它,因为实际模板有第二个默认值。这适用于 C++11 及更高版本。

#include <vector>

template<template <typename...> class Container>
Container<int> foo() {
    return Container<int>{1,2,3};
}

int main() {
    auto bar = foo<std::vector>();
    return 0;
}

关于c++ - 当函数返回由模板类型和另一个类型组成的类型时,模板参数推导,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44211723/

相关文章:

lisp - common-lisp 中更好的 pythonic `join`

c++ - Boost::Math::Quaternion 中的异常防护习语

c++ - 未指定绑定(bind)

c++ - 使用模板从类型列表中提升类型

c++ - 检测 SFINAE 的 POD 类型的第一个成员

c++ - 通用实现获取类型列表的大小

c# - "add as link"选项发生了什么?

c++ - 自编辑 Makefile

c++ - 访问作为非类型模板参数传递的std数组元素会在msvc上给出非编译时常量值

c++ - C++ 11 中具有多个模板参数的模板函数的特化