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
    }
};

Live demo