Class 带有数组或向量参数的模板

Class template with array or vector arguments

我需要编写一个 class 模板定义,其中包含两个模板参数(type 、仿函数)和两个模板参数(array/std::vector 、int),可以执行以下代码:

    const char* message= "Message";

    const transform<char, firstFunctor> first(message, lengthOfMessage);

    transform_view<int, secondFunctor> second(intArray, intSize);

    transform<double, thirdFunctor> third(doubleArray, doubleSize);

数组/向量的类型必须与第一个模板参数的类型匹配。

我尝试了一些这样的变体:

   template <typename A, typename B>
   class transform
   {
   public:
    transform<A, B>(A[], B) {...};
   }

但是我无法让构造函数的第一个参数匹配所有三种类型。

感谢任何建议,谢谢!

你写错了构造函数的定义。

transform<A, B>(A[], B) {...};你会传递一个vector,那你为什么要写A[]作为参数类型呢?

您需要如下内容

#include <iostream>

template <typename T>
struct functor{
    void operator()(const T array [], size_t sze) {
        for (int i{}; i < sze; ++i) {
            std::cout << array[i] << " ";
        }
        std::cout << "\n";
    }
};

template<typename T, typename Function>
class transform {
    const T* array;
    size_t sze;
    Function functor{};
public:
    transform(const T array [], size_t sze):array{array}, sze{sze}{
        functor(array, sze);

    }
};

template< typename T, typename E>
using transform_view =  transform<T, E>;


int main()
{
    using firstFunctor = functor<char>;
    using secondFunctor = functor<int>;
    using thirdFunctor = functor<double>;
    const char *message = "Message";
    size_t lengthOfMessage = 7;

    int intArray[] = {1, 3};
    size_t intSize = 2;

    double doubleArray[] = {1.4, 3.2};
    size_t doubleSize = 2;

    //The given three lines
    const transform<char, firstFunctor> first(message, lengthOfMessage);

    transform_view<int, secondFunctor> second(intArray, intSize);

    transform<double, thirdFunctor> third(doubleArray, doubleSize);
}
The output
M e s s a g e
1 3
1.4 3.2

据我了解,问题在于第一个参数是模板中的数组。 尝试以下构造函数:

transform(A* arr, B el){
    //now here is a tricky part, because there is a very big difference
    //between a char*, and an int/double/unsigned/float/... *.

}

如果您在 class 中有一个类型 A 的数组,并且想将其更改为通过的数组:

private:
    A* my_array;

你可以这样试试:

if(dynamic_cast<char*>(arr)) //if arr is of type char* {

    if (this->my_array != nullptr) delete my_array; //not needed if in a basic constructor...
    size_t len = strlen(arr);
    my_array = new char [len + 1];
    strcpy(this->my_array, arr); //(destination, source)
    my_array[len] = '[=12=]';
} 
else //if it is a numeric array
{
this->my_array = arr;
//redirecting the pointers in enough
}

哦,如果你在 Visual Studio,如果你写

,strcpy 将工作

文件顶部的“#pragma warning (disable: 4996)”。

否则它会将其标记为不安全并建议 strncpy,strcpy_s,...