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,...
我需要编写一个 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,...