访问函数的调用方类型
Accessing function's caller type
现在,我知道这个问题多次出现,例如这里。但是,对于初学者而言,此问题只是"不要使用它,这是不好的编程",我认为这是我用例中最好的解决方案。
但要点:我想在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();
}
};
相关文章:
- 是否可以根据其数据成员的类型确定类型的大小
- 如何对命名空间限定类型进行类型定义?
- 如何在C++中允许成员函数的自定义返回类型进行类型擦除?
- 类型名称 T::类型::值中的预期非限定 id
- if(双精度类型 == 字符类型)
- 模板冲突的类型-但类型应该是相同的cfr类层次结构
- 如何在模板参数中分离函数类型返回类型和参数
- 对于类型类::类型,我可以从常量类派生常量类::类型吗?
- 包装任意类型/非类型模板类的模板类
- C++ 类型 * 和类型 *&在函数中的区别是什么
- C++ 按非类型参数类型划分的模板专用化
- 如何进行编译时type_check并且仅在类成员的类型与类型匹配时才编译类的一部分?
- 另一个:从"常量类型*"到"类型*"的转换无效
- 类型长的长度和未解决的超载函数类型的类型的操作数与二进制运算符
- 仅为某些模板专用化定义转换运算符:预期类型/预期类型说明符
- 包含类型的类型的模板函数重载
- static_cast实际上不是对象类型的类型是未定义的行为吗?
- 从参数的返回类型推断类型
- 访问函数的调用方类型
- 正在将pImpl指针转换回调用方类型