c ++函数返回模板类型检查
c++ function returning template type checking
我已经通读了这里的一些问题,但找不到与我的问题相关的任何内容,所以我不知道我是完全错了还是只是遗漏了一些特定的内容。
我想做的是标记一些数据并将其输入到一个函数中,并将 return 数据作为特定类型输入,具体取决于读入的数据或 return bool false 如果验证输入失败。我有超过 20 个 .cpp 和 20 个 .h 文件,所以我只会 post 这里的相关部分,希望足够了...
#include "utility1.h"
#include <fstream>
#include <boost/tokenizer.hpp>
using namespace std;
using namespace boost;
string buffer;
template <class T>
bool loadStaff(char* staffName) {
ifstream staffFile;
T data;
int datapos = 0;
staffFile.open(staffName, ios::in);
if (!staffFile.is_open()) {
cout << "Cant open file: " << staffName << endl;
return false;
}
while (staffFile.good()) {
getline(staffFile, buffer);
tokenizer<> tok(buffer);
for (tokenizer<>::iterator pos=tok.begin(); pos!=tok.end(); ++pos) {
data = validate(datapos, *pos);
// want to type check 'data' here
}
}
staffFile.close();
return true;
}
template <class T>
T validate(int datapos, string token) {
switch(datapos) {
case 0:
if (sizeof(token) != 2)
return false;
else
return token;
break;
}
}
那我该怎么办呢?会铸造工作?还是不会因为它可能会更改数据类型而不是检查它是什么数据类型。
对于第一次检查,我想检查是否验证 returns bool false 然后导致错误(稍后将更改为 try and catch 语句,但现在只想让它工作。
非常感谢任何帮助,在此先感谢。 :)
这里的问题是编译器需要在编译时知道每个表达式的类型,而您正试图创建一个 return 类型仅在运行时才知道的函数。
而是为您想要的所有类型创建一个基础 class return 和 return 指向它的指针(以便虚拟方法起作用)。
如果您还想在验证失败时 return bool,您可以 return 例如 std::pair<bool, base_token *>
其中第一项表示验证是否成功,如果是则第二项是有效指针。
不,你不能那样做。您正在尝试使模板参数 T 依赖于 运行 时间变量 - 而模板参数必须在编译时推导。
您可以改为使用 boost::any。
我已经通读了这里的一些问题,但找不到与我的问题相关的任何内容,所以我不知道我是完全错了还是只是遗漏了一些特定的内容。
我想做的是标记一些数据并将其输入到一个函数中,并将 return 数据作为特定类型输入,具体取决于读入的数据或 return bool false 如果验证输入失败。我有超过 20 个 .cpp 和 20 个 .h 文件,所以我只会 post 这里的相关部分,希望足够了...
#include "utility1.h"
#include <fstream>
#include <boost/tokenizer.hpp>
using namespace std;
using namespace boost;
string buffer;
template <class T>
bool loadStaff(char* staffName) {
ifstream staffFile;
T data;
int datapos = 0;
staffFile.open(staffName, ios::in);
if (!staffFile.is_open()) {
cout << "Cant open file: " << staffName << endl;
return false;
}
while (staffFile.good()) {
getline(staffFile, buffer);
tokenizer<> tok(buffer);
for (tokenizer<>::iterator pos=tok.begin(); pos!=tok.end(); ++pos) {
data = validate(datapos, *pos);
// want to type check 'data' here
}
}
staffFile.close();
return true;
}
template <class T>
T validate(int datapos, string token) {
switch(datapos) {
case 0:
if (sizeof(token) != 2)
return false;
else
return token;
break;
}
}
那我该怎么办呢?会铸造工作?还是不会因为它可能会更改数据类型而不是检查它是什么数据类型。
对于第一次检查,我想检查是否验证 returns bool false 然后导致错误(稍后将更改为 try and catch 语句,但现在只想让它工作。
非常感谢任何帮助,在此先感谢。 :)
这里的问题是编译器需要在编译时知道每个表达式的类型,而您正试图创建一个 return 类型仅在运行时才知道的函数。
而是为您想要的所有类型创建一个基础 class return 和 return 指向它的指针(以便虚拟方法起作用)。
如果您还想在验证失败时 return bool,您可以 return 例如 std::pair<bool, base_token *>
其中第一项表示验证是否成功,如果是则第二项是有效指针。
不,你不能那样做。您正在尝试使模板参数 T 依赖于 运行 时间变量 - 而模板参数必须在编译时推导。
您可以改为使用 boost::any。