我有以下代码:
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
不能解决它,因为在某些时候,我们需要将它转换回原始的处理器
,而我们不知道我们处理的是哪种处理器
。
想法? 任何类型的模板魔术或预处理诡计是赞赏的!
如果我理解得很好的话,您可以将模板与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;
}
活着