gpt4 book ai didi

c++ - boost::any 和模板

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:07:57 25 4
gpt4 key购买 nike

我正在编写一个包含大量模板技巧和 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 种不同的类型,那就是 10,000 个 if 语句! Boost 预处理器可以在这方面提供帮助,但这仍然是一个糟糕的解决方案。

有没有更好的方法来调用带有 boost::any 内容的模板化函数而不诉诸这种疯狂?据我所知,没有。

最佳答案

如果可以同时设置所有 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)'
}
};

关于c++ - boost::any 和模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15102139/

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