具有编译时间常数的模板化Lambda函数

时间:2019-03-17 04:35:03

标签: c++ templates lambda c++20

我在线获得了这段代码(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

1 个答案:

答案 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

我们在其中编写适配器的地方,但这很尴尬。