- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个带有模板化成员函数的类:
class Person
{
template <typename TItem>
void DoSomething(TItem item)
{
item.Action();
}
};
这使我可以传递任何具有 Action 成员函数的项目,然后此人将对该项目执行该操作。所以我可以这样做:
Person person;
BaseballBat bat;
person.DoSomething(bat);
这个结构允许我用任何类型的对象调用函数。但是,如果我想存储任何类型的对象,我必须对类进行模板化:
template <TItem>
class Person
{
public:
void DoSomething()
{
this->Item.Action();
}
void SetItem(TItem item)
{
this->Item = item;
}
private:
TItem Item;
};
Person<BaseballBat> person;
BaseballBat bat;
person.SetItem(&bat);
person.DoSomething();
这很烦人,因为我必须重新实例化 Person 类才能更改对象的类型。
或者,我可以从父类派生该项目:
class Person
{
public:
void DoSomething()
{
this->Item.Action();
}
void SetItem(TItem* item)
{
this->Item = item;
}
private:
ParentItem* Item;
};
class ParentItem{};
class BaseballBat : public ParentItem
{}
Person person;
BaseballBat bat;
person.SetItem(&bat);
person.DoSomething();
这很烦人,因为我必须维护所有项目的继承结构(这看起来很“非 GP”)。
当我有多层“包含对象的对象”时,问题真的来了——也就是说,我必须将函数模板参数从非常“顶层”的调用“传递”到包含的类:
class BaseballBat
{
void DoAction();
};
class Child
{
template <typename TItem>
void DoAction(TItem item)
{
item.DoAction();
}
};
class Person
{
Child child;
// This is annoying to have to pass the item to the person, who then has to pass it to the child. I'd rather "give" the child an Item, then just be able to call child.DoAction(), where the Person doesn't know anything about the item.
template <typename TItem>
void PlayWithChild(TItem item)
{
child.DoAction(item);
}
}
谁能评论一下如何正确混合函数模板和将对象存储为成员数据这两种想法? (以上只是试图演示的俗气示例 - 如果它们没有意义或者您有更好的示例,我洗耳恭听 :))。
------------ 编辑--------也许更好的例子是我真实案例的简化。我有一个具有成员函数的类匹配器:
template<typename TDistanceFunctor, typename TPropagationFunctor>
void Matcher::Compute(TDistanceFunctor distanceFunctor, TPropagationFunctor propagationFunctor);
然后我有另一个使用匹配器的类 ImageAlgorithm:
template<typename TMatcher>
void ImageAlgorithm::Compute(TMatcher matcher)
{
matcher.Compute(...); // How do I get the DistanceFunctor and the PropagationFunctor here?
}
我想这样称呼这些东西:
Matcher myMatcher;
.... Setup matcher (how?) ...
ImageAlgorithm algorithm;
algorithm.Compute(myMatcher);
我不知道如何通过 ImageAlgorithm 对象“传递”DistanceFunctor 和 PropagationFunctor,以便它可以到达 ImageAlgorithm::Compute 调用中的 Matcher 对象。当然,我可以在 TDistanceFunctor 上模板化 Matcher,并将 TDistanceFunctor 存储为成员变量,但之后我无法将 matcher 使用的距离仿函数更改为不同类型的距离仿函数。
最佳答案
您可以尝试使用 boost::any持有你的类型变体成员。
从概述:
The boost::any class (...) supports copying of any value type and safe checked extraction of that value strictly against its type.
编辑
你是对的,使用 boost any 调用存储仿函数会出现问题。所以我建议另一种解决方案:使用 std::function(或 boost::function)来包装仿函数。这样 Matcher 就可以保存相关语法的函数对象(例如,没有参数),并且不需要在仿函数类型上进行模板化。
函数对象已经为您完成了 OO(至少在某种意义上)和 GP 之间的组合。
关于c++ - 难以结合 GP 和 OOP 概念,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11914717/
我想模拟这个函数: function getMetaData(key) { var deferred = $q.defer(); var s3 = vm.ini
我是一名优秀的程序员,十分优秀!