我正在写一个包含大量模板技巧和boost::any的库。我遇到了一种情况,我基本上有这样的情况:
boost::any a1, a2, a3, a4;..。我需要调用一个函数,如下所示:
template <typename A1, typename A2, typename A3, typename A4>
void somefunc (A1 a1, A2 a2, A3 a3, A4 a4);我可以求助于一系列嵌套得很糟糕的if语句,但假设我在处理10个不同的类型,那就是10000个if语句!Boost预处理器可以在这方面有所帮助,但这仍然是一个糟糕的解决方案。
有没有更好的方法来调用带有boost::any内容的模板化函数,而不是求助于这种疯狂?据我所知,没有。
发布于 2013-02-27 09:26:08
如果您的所有any对象都可以同时设置,那么您就可以立即对函数指针的类型进行硬编码。将其全部放入一个单独的对象中,就可以了。这基本上是对type-erasure的双重利用,也可以通过虚拟函数实现(就像boost::any的内部工作方式一样),但我更喜欢这个版本:
// note that this can easily be adapted to boost::tuple and variadic templates
struct any_container{
template<class T1, class T3, class T3>
any_container(T1 const& a1, T2 const& a2, T3 const& a3)
: _ichi(a1), _ni(a2), _san(a3), _somefunc(&somefunc<T1, T2, T3>) {}
void call(){ _somefunc(_ichi, _ni, _san); }
private:
boost::any _ichi, _ni, _san;
// adjust to your need
typedef void (*func_type)(boost::any&, boost::any&, boost::any&);
func_type _somefunc;
template<class T1, class T2, class T3>
void somefunc(boost::any& a1, boost::any& a2, boost::any& a3){
// access any objects with 'boost::any_cast<TN>(aN)'
}
};https://stackoverflow.com/questions/15102139
复制相似问题