std::array 未知长度作为模板函数规范的类型
std::array with unknown length as a type for template function specification
我想将类型已知但大小未知的 std::array
class 传递给模板函数专业化:
class foo {
public:
void bar<class T>(T arg1, int arg2, int arg3) {
//For any other T
}
void bar<std::array<rs::float3, size>>(T arg1, arg2) {
//Specific function for type std::array of rs::float3's and unknown length (size is not a type, just variable).
}
怎么样
template <typename T>
void foo (T const &)
{ std::cout << "foo generic" << std::endl; }
template <std::size_t Dim>
void foo (std::array<float, Dim> const &)
{ std::cout << "foo float array dim " << Dim << std::endl; }
?
以下是完整的工作示例
#include <array>
#include <iostream>
template <typename T>
void foo (T const &)
{ std::cout << "foo generic" << std::endl; }
template <std::size_t Dim>
void foo (std::array<float, Dim> const &)
{ std::cout << "foo floar array dim " << Dim << std::endl; }
int main ()
{
foo(0);
foo(std::array<float, 12U>{});
}
如果您希望函数接受 array
个不同大小的对象,您几乎需要将其设为函数模板,并将大小作为模板参数传递:
template<size_t N>
void bar(std::array<rs::float3, N> const &arg1,
std::array<rs::float3, N> cons t&arg2)
{
// ...
}
在这种情况下,我猜你也希望它是另一个模板的部分特化。不幸的是,函数模板没有部分特化。标准中有一部分处理函数模板的部分排序,但通常的建议是您只使用重载。
试试这个:
class foo
{
public:
template <class T>
void bar(T arg1, int arg2, int arg3) {
//For any other T
}
template <size_t size>
void bar(std::array<rs::float3, size> arg1, int arg2) {
//Specific function for type std::array of rs::float3's of caller-specified length
}
};
我想将类型已知但大小未知的 std::array
class 传递给模板函数专业化:
class foo {
public:
void bar<class T>(T arg1, int arg2, int arg3) {
//For any other T
}
void bar<std::array<rs::float3, size>>(T arg1, arg2) {
//Specific function for type std::array of rs::float3's and unknown length (size is not a type, just variable).
}
怎么样
template <typename T>
void foo (T const &)
{ std::cout << "foo generic" << std::endl; }
template <std::size_t Dim>
void foo (std::array<float, Dim> const &)
{ std::cout << "foo float array dim " << Dim << std::endl; }
?
以下是完整的工作示例
#include <array>
#include <iostream>
template <typename T>
void foo (T const &)
{ std::cout << "foo generic" << std::endl; }
template <std::size_t Dim>
void foo (std::array<float, Dim> const &)
{ std::cout << "foo floar array dim " << Dim << std::endl; }
int main ()
{
foo(0);
foo(std::array<float, 12U>{});
}
如果您希望函数接受 array
个不同大小的对象,您几乎需要将其设为函数模板,并将大小作为模板参数传递:
template<size_t N>
void bar(std::array<rs::float3, N> const &arg1,
std::array<rs::float3, N> cons t&arg2)
{
// ...
}
在这种情况下,我猜你也希望它是另一个模板的部分特化。不幸的是,函数模板没有部分特化。标准中有一部分处理函数模板的部分排序,但通常的建议是您只使用重载。
试试这个:
class foo
{
public:
template <class T>
void bar(T arg1, int arg2, int arg3) {
//For any other T
}
template <size_t size>
void bar(std::array<rs::float3, size> arg1, int arg2) {
//Specific function for type std::array of rs::float3's of caller-specified length
}
};