提问者:小点点

如何将编译时逻辑移动到客户端代码


我有以下代码:

void processUserInput(const std::string& input)
{
    if ("apples" == input)
    {
        Apple apple{};
        Processor<Apple> processor{};
        processor.process(apple);
    }
    else if ("raspberries" == input)
    {
        // ...
    }
}

因此,我的ProcessUserInput可能是某个UserInputProcessor类中的一个方法。 我希望客户机代码能够告诉UserInputProcessor匹配逻辑的样子。 它仍然在编译时,但只是在不同的位置,这样UserInputProcessor的用户就不必进入类内部,而可以从外部告诉它如何进行匹配。

基本上类似于pseudocodeUserInputProcessor.match(“apples”,Apple),其中Apple是一个类型。 或者直接将处理器作为对象提供给它,但这将是UserInputProcessor内部的一个问题,即如何将不同的处理器放在同一个容器中。 std::any不能解决它,因为在某些时候,我们需要将它转换回原始的处理器,而我们不知道我们处理的是哪种处理器

想法? 任何类型的模板魔术或预处理诡计是赞赏的!


共1个答案

匿名用户

如果我理解得很好的话,您可以将模板与If constexpr一起使用,如下所示

#include <iostream>

class Apples{};
class Raspberries{};

template<class T>
struct userInputProcessor{
    void processUserInput(const std::string& input)
    {
        if constexpr (std::is_same_v<T, Apples>)
        {
            Apples apple{};
            std::cout << "\nA";
        }
        else if constexpr (std::is_same_v<T, Raspberries>)
        {
            // ...
            std::cout << "\nR";
        }
    }
};
int main()
{
    userInputProcessor<Apples>{}.processUserInput("string");
    userInputProcessor<Raspberries>{}.processUserInput("string");
    return 0;
}

活着