这是我试图实现的模板类:
#ifndef __ENCRYPTION_HEADER_INCLUDED__
#define __ENCRYPTION_HEADER_INCLUDED__
#include <iostream> // in/out
#include <fstream> // file
#include <string> // string
#include <sstream> // string stream
using namespace std; // standard namespacing eliminates std:: from code
template <class mytemp>
class encryption
{
public:
mytemp * p;
encryption();
mytemp encrypt_function (mytemp);
};
template <class mytemp>
encryption<mytemp>::encryption ()
{
string line_in, file_name;
mytemp input_value;
cout << "input file name which contains encryption keys: " ;
getline(cin, file_name);
cout << '\n';
ifstream val_file (file_name.c_str());
p = new mytemp[10];
if (val_file.is_open())
{
while (getline(val_file, line_in))
{
istringstream line_out(line_in);
line_out >> hex >> input_value;
*p = input_value;
p++;
}
p -= 10;
val_file.close();
}
else
{
cout << "file not found" << '\n';
}
}
template <class mytemp>
mytemp encryption<mytemp>::encrypt_function (mytemp input_en)
{
mytemp output_en = input_en;
for (mytemp k = 0; k < 10; k++)
{
output_en ^= *(p + k); // does not work with double or float but works with int?
}
return output_en;
}
#endif // __ENCRYPTION_HEADER_INCLUDED__
下面显示的是我遇到问题的一行:
output_en ^= *(p + k); // does not work with double or float but works with int?
我的理解是这对于一个整数是正确的,但它不适用于double或float,我想知道是否有一种简单的方法可以让它工作,而不是重写代码来增加指针而不是递增指向价值观?
答案 0 :(得分:0)
指针算术需要带符号整数(即std::ptrdiff_t
)类型,其中double或float都不是。在这个循环中:
for (mytemp k = 0; k < 10; k++)
{
output_en ^= *(p + k); // does not work with double or float but works with int?
}
使用float或double是没有意义的。只需使用signed int(int
是)。
答案 1 :(得分:0)
不为这些类型定义按位xor。如果您只是将输入解释为位,那么您应该执行memcpy()
或memset()
所做的操作,并将它们解释为无类型的字节数组。也就是说,您的模板包装器可以确定数据的地址和大小,并将它们传递给与内存块相关的函数。