如何将对象数组作为参数传递给模板

时间:2018-10-06 18:27:05

标签: c++ arrays c++11 templates

我正在尝试创建一个模板,该模板将接受对C样式的对象数组的引用作为参数:

#include <iostream>

class A
{
public:
A(){}
};

template<int N, class A& obj> struct W {};

int main()
{
A b[5]; 
W<5,b> w; 
}

但是在编译代码时出现错误:

$ c++ -std=c++11 -g try37.cpp
try37.cpp: In function 'int main()':
try37.cpp:14:5: error: the value of 'b' is not usable in a constant expression
 W<5,b> w;
     ^
try37.cpp:13:3: note: 'b' was not declared 'constexpr'
 A b[5];
   ^
try37.cpp:14:6: error: could not convert template argument 'b' to 'A&'
 W<5,b> w;
      ^
try37.cpp:14:9: error: invalid type in declaration before ';' token
 W<5,b> w;
         ^

我尝试了很多方法,但是无法解决编译问题?怎么解决的?

4 个答案:

答案 0 :(得分:2)

您的代码中存在一些问题。

(1)如果要将引用作为模板参数传递给对象,则必须将其定义为constexpr并赋予其外部 static 链接({ {1}}是不必要的,可从birdfreeyahoo(谢谢!)进行更正,所以

static

(2)如果要使用默认构造函数初始化constexpr A b[5]; int main () { W<5,b> w; } constexpr对象的(C样式数组),则也必须使A成为构造函数。

所以

contexpr

(3)如果希望public: constexpr A(){} 的第二个模板参数是对W s的常量C样式数组的引用,其中维是第一个参数,则语法为< / p>

A

因此完整的程序成为

template <int N, A const (& obj)[N]>
struct W
 { };

答案 1 :(得分:0)

首先,您只能将1个A实例传递给模板。 将其更改为A[n] obj 注意:它将转换为指向A的指针!

第二,您传递的数组必须具有静态存储期限。因此,要么将数组设为静态,要么将其作为全局变量。

答案 2 :(得分:0)

编辑:C样式数组已添加到答案。

如果尝试使结构W具有对象容器,则可以使用向量。我仍然不确定为什么要这么做。

struct W
{
    template<typename Type, typename A> //constructor with a vector
    W(std::vector<Type,A> & vec)
    {
       //...
    }

    template<typename Type>
    W(int arraySize, Type & obj) //constructor with an array
    {
       //...

    }
};

int main()
{
    const int ArraySize = 5;
    A b[ArraySize];
    std::vector<A> vec;

    for(int i =0; i < 5; i++)
        vec.push_back(b[i]);

    W w(vec); //calling struct W constructor that takes a vector.
    W w2(ArraySize,b); //calling struct W constructor that takes c style array
    return 0;
}

答案 3 :(得分:0)

template < typename TElement, std::size_t NElement>
constexpr std::size_t sizeof_array( TElement const (&arr)[NElement] )
{
     (void)arr; // Unused, could have been anonymous
     return NElement;
}

template < typename TArray>
constexpr std::size_t sizeof_array2( const TArray& arr )
{
     return ( sizeof( arr ) / sizeof( arr[0] ) );
}

然后在您的代码中:

char arr[] = "abcdef;
sizeof_array(arr); // C-styled array
sizeof_array2(arr);