访问函数的调用方类型

Accessing function's caller type

本文关键字:类型 方类型 函数 调用 访问      更新时间:2023-10-16

现在,我知道这个问题多次出现,例如这里。但是,对于初学者而言,此问题只是"不要使用它,这是不好的编程",我认为这是我用例中最好的解决方案。

但要点:我想在C 中访问该函数的呼叫者的类型。TLDR,我想在typeid(CALLER)中使用它。以下以下有关我用例的详细信息

我有一个对象,我们称其为 AnalyzedObject,这是由多个(多态(Evaluator s进行评估的主题,无论它是被接受还是被拒绝。总而言之,我希望AnalyzedObject本身知道它是被接受还是被拒绝,但事实是Evaluator S'投票不是直接计算的,并且每个Evaluator的影响取决于其类型。因此,我有或多或少看起来像:

struct AnalyzedObject {
  unordered_map<type_index, bool> votes;
  bool accepted;
  // other data...
  void add_vote(bool vote) {
    votes[????]=vote;
  }
}
class Evaluator {
  void Evaluate(AnalyzedObject& obj) {
    obj.add_vote(vote());
  }
  virtual void vote() = 0;
}
class VotingPolicy {
  bool Elect(unordered_map<type_index, bool> votes);
}
AnalyzedObject object;
vector<Evaluator*> evaluators;
for(auto evaluator : evaluators) {
  evaluator->Evaluate(object);
}
VotingPolicy policy;
object.accepted = policy.Elect(object.votes);

那么,问题是:我应该如何填写问号(????(,在这里完成工作?

我知道,我可以做一些解决方法,例如

void add_vote(Evaluator& type, bool vote) {
  votes[typeid(decltype(evaluator))]=vote;
}

template<class T>
void add_vote(bool vote) {
  votes[typeid(T)]=vote;
}

,但要对API纠正进行培养,该论点将始终存在this,因此应省略它...

无论如何,如果您碰巧有其他想法解决我的问题,请随时提出不同的问题!

这是一个投票政策的示例,该策略收集了一系列选民,并返回对某些对象的"是/否"投票。我认为此示例非常适合将逻辑放入功能中,并传递每个功能所需的内容。

#include <vector>
// abstract base class (interface) for AnalyzedObject
class AnalyzedObject {
public:
    AnalyzedObject() {}
    virtual ~AnalyzedObject() {}
    // provide getters for all the things an evaluator may consider
    virtual bool Do_you_support_key_feature_one() const = 0;
    virtual bool Do_you_support_key_feature_two() const = 0;
    virtual int YearsService() const = 0;
    virtual int Price() const = 0;
};
// abstract base class (interface) for voter/evaluator
class Evaluator {
public:
    Evaluator();
    virtual ~Evaluator() {}
    virtual bool vote(const AnalyzedObject&) = 0;
};
// raw pointers here is ill-advised
typedef std::vector<Evaluator*> voter_panel_type;
// abstract base class (interface) for voting policy
class VotingPolicy {
public:
    VotingPolicy();
    virtual ~VotingPolicy() {}
    virtual bool vote(voter_panel_type, const AnalyzedObject&) = 0;
};
// implement a voting policy
class MajorityRules : public VotingPolicy {
    bool vote(std::vector<Evaluator*> evaluators, const AnalyzedObject &object) {
        voter_panel_type::size_type yes = 0;
        for (auto voter : evaluators) {
            if (voter->vote(object))
                yes += 1;
        }
        return yes * 2 > evaluators.size();
    }
};