gpt4 book ai didi

c++ - Loki 的多重方法是否进入了 C++11?

转载 作者:可可西里 更新时间:2023-11-01 18:35:49 27 4
gpt4 key购买 nike

我正在阅读 Modern C++ Design Generic Programming and Design Patterns Applied Andrei Alexandrescu第 11 章关于多方法 正好解决了我要解决的问题。本书的所有源代码都发布在名为 Loki 的库中.

问题在于这本书相当古老(2001 年)并且处理的限制在 C++11 中不再适用(例如,模板参数的数量不能可变)。我试图查看 Loki 是否已使用 C++11 重写,但最后一次修改日期为 2009 年,Andrei Alexandrescu's home page 上没有更新。 .然而,在做了一些研究之后,我觉得 Loki 有点像 Boost,因为它被纳入了标准库。

C++11 是否采用了multimethod 习语或其部分内容?

最佳答案

它不在标准中,但使用由一对 typeid 索引的函数对象映射可以相当容易地构建。

为了完整起见,这是我的第一次尝试:

#include <iostream>
#include <typeinfo>
#include <typeindex>
#include <map>
#include <functional>
#include <memory>

struct Animal {
virtual std::type_index type() const = 0;
};

template <class T> struct AnimalImpl : public Animal {
std::type_index type() const override {
return typeid(T);
}
};

struct Dog : AnimalImpl<Dog> {

};

struct Cat : AnimalImpl<Cat> {

};

struct Mouse : AnimalImpl<Mouse> {

};

using Types = std::tuple<std::type_index, std::type_index>;
using Outcome = std::function<void (Animal&, Animal&)>;
using DispatchMap = std::map<Types, Outcome>;

using namespace std;


void catVDog(Animal& cat, Animal& dog) {
cout << "dog wins\n";
}

void catVMouse(Animal& cat, Animal& mouse)
{
cout << "cat wins\n";
}

DispatchMap makeOutcomes()
{
DispatchMap result;
result.emplace( make_pair( Types {typeid(Cat), typeid(Dog)}, catVDog) );
result.emplace( make_pair( Types {typeid(Dog), typeid(Cat)},
[](Animal&a1,Animal&a2) { return catVDog(a2,a1); }) );

result.emplace( make_pair( Types {typeid(Cat), typeid(Mouse)}, catVMouse) );
result.emplace( make_pair( Types {typeid(Mouse), typeid(Cat)},
[](Animal&a1,Animal&a2) { return catVMouse(a2,a1); }) );
return result;
}

const DispatchMap outcomes = makeOutcomes();

void fight(Animal& a1, Animal& a2)
{
auto it = outcomes.find(Types{ a1.type(), a2.type() });
if (it == outcomes.end()) {
cout << typeid(a1).name() << " " << typeid(a2).name() << " ";
std::cout << "no fight\n";
}
else {
it->second(a1, a2);
}
}


int main()
{
unique_ptr<Animal> cat { new Cat {} };
unique_ptr<Animal> dog { new Dog {} };
unique_ptr<Animal> mouse { new Mouse {} };

fight(*cat, *dog);
fight(*cat, *mouse);
fight(*dog, *cat);
fight(*dog, *mouse);

return 0;
}

关于c++ - Loki 的多重方法是否进入了 C++11?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23336586/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com