我在线获得了这段代码(split code),以一种非常酷的方式拆分了字符串,但是我想使其更加通用和易于管理。我已经实现了一种变通方法,使用constexpr将它作为模板化类通过输入参数传递给我,但是我想知道是否有人会知道如何进行这项工作。
我制作了一个lambda函数,该函数接受一个编译时间常数,而我正在尝试调用它。在呼叫站点,它会将模板参数误认为是试图执行小于操作符的表达式。
auto splt_val = []<char delimiter='\n'>(std::string s)->std::vector<std::string>{
std::istringstream iss(s);
std::vector<std::string> parm_data(
(std::istream_iterator<WordDelimitedBy< delimiter > >(iss)),
std::istream_iterator<WordDelimitedBy< delimiter > >());
return parm_data;
};
splt_val<'\n'>("test"); //<-- DOESN'T WORK
splt_val("test"); //<-- THIS WORKS
答案 0 :(得分:4)
public void readFile(String file) throws FileNotFoundException{
File myFile = new File("Cars.txt");
Scanner scanner = new Scanner(myFile);
String line = scanner.nextLine();
String delimiter = ",";
StringTokenizer tokenizer = new StringTokenizer(line, delimiter);
int tokenCount = new StringTokenizer(line, ",").countTokens(); //counts the tokens, should yield 4
while(tokenizer.hasMoreTokens()){
if(tokenCount != 4){ //if there isn't exactly 4 tokens, print the rest to the console
System.out.println(tokenizer.toString());
}
else {
//newCar(Make, Model, Year, Mileage);
Car newCar = new Car(tokenizer.nextToken(), tokenizer.nextToken(), Integer.parseInt(tokenizer.nextToken()), Integer.parseInt(tokenizer.nextToken()));
unsortedList.add(newCar);
sortedList.addAll(unsortedList);
}
if(scanner.hasNextLine()){
line = scanner.nextLine();
tokenizer = new StringTokenizer(line, delimiter);
tokenCount = new StringTokenizer(line, ",").countTokens(); //counts the tokens, should yield 4
}
else{
break;
}
}
scanner.close();
selectionSort(sortedList);
}
是的,这种语法很烂。
splt_val.operator()<'\n'>("test");
这为您提供了所需的语法。但这意味着每个模板参数都有一个不同的template<char delimiter='\n'>
constexpr auto splt_val = [](std::string n)-> // ...
对象。
您可能会写:
splt_val
我们在其中编写适配器的地方,但这很尴尬。