【发布时间】:2017-09-08 23:46:50
【问题描述】:
我遇到了这样的问题,我正在尝试编译:
#include <vector>
#include <array>
struct Test
{
template <template <typename...> class Container, typename T, typename... Args>
void SetData(const Container<T, Args...>& data)
{
// compiles for vector but not array
// 'void Test::SetData(const Container<T,Args...> &)': could not deduce template argument for 'const Container<T,Args...> &' from 'std::array<float,3>'
}
};
int main()
{
Test test;
std::vector<int> vector{ 1,2,3 };
std::array<float, 3> arr{1.0f, 2.0f, 3.0f};
test.SetData(vector);
test.SetData(arr);
return 0;
}
基本上我需要一个可以接受任意 STL 容器(更具体地说是 std::vector 和 std::array)的函数签名,并且我需要在函数中也可见的类型 T(即 int 或 float 在这个案例)。其他类型(分配器或std::array 大小)我不关心。
什么是正确的签名?
【问题讨论】:
-
您将无法获得一个模板来获取所有模板,因为
std::array使用非类型模板参数。 -
@KaiserJohaan - 答案改进:在
isCnt中定义类型,其名称与type不同(也由std::true_type和std::false_type继承),例如containedType,它是可以简化在T上工作的 SFINAE 启用/禁用部分,并避免将std::enable_if与返回类型一起使用。
标签: c++ c++11 templates stl variadic-templates