标题很难用文字表达,但这是我试图在不可编译的代码中实现的目标:
template<template <typename> class Container>
Container<int> foo() {
return Container<int>{1,2,3};
}
int main() {
auto bar = foo<std::vector>();
return 0;
}
基本上我想要一个模板函数,它可以从传递给它的类型和先前已知的类型(在本例中)“组合”其返回类型int
)。在本例中,我想要一个函数,该函数在调用者指定的容器内返回任意数据类型。 (我所说的任意并不是指编译时随机或不确定的,而是调用者没有关于数据类型的“输入”,这是在函数本身内部确定的)。
这种类型的事情甚至可以通过 clang 或 gcc 与 std+1z 来实现吗?我是否遗漏了一些非常明显的东西?是否有一个跨越数百个我不知道的字符的“1 行”解决方案?
我在这里看到了类似事物的各种示例,但它们似乎都假设函数将指针或引用作为参数并填充这些容器。
你唯一的麻烦是std::vector
is not a 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;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)