gpt4 book ai didi

c++ - 基于类模板的包装函数

转载 作者:行者123 更新时间:2023-11-30 05:14:30 29 4
gpt4 key购买 nike

假设我们必须使用由一组函数组成的相同旧式界面的多个版本。版本之间的区别在于命名约定和每个函数中我们需要在每次函数调用后处理的附加常用最后一个参数。有点像

bool f1_v1(double a, int *common_arg);
// .....

bool fN_v1(double a, bool b, char c, int *common_arg);

简单的基于模板的包装看起来像

template <typename T> struct wrapper;

template<typename _Res, typename... _ArgTypes>
struct wrapper<_Res(_ArgTypes...)> {

template <_Res (*f)(_ArgTypes...)>
struct wrap {

template <typename... Args>
_Res operator()(Args... args) {
int common_arg;
_Res res = f(args..., &common_arg);
// common processing....
// .....

return res;
};
};
};

wrapper<decltype(f1_v1)>::wrap<f1_v1> _f1;
// .....

wrapper<decltype(fN_v1)>::wrap<fN_v1> _fN;

看起来很丑,不是吗?而且我们仍然需要宏来避免函数名的双重替换。有没有优雅的解决方案?

最佳答案

目前,C++11 或 C++14,我认为你只能简化 wrapper 类,避免内部 wrap 结构,使用部分特化如下

template <typename T, T>
struct wrapper;

template <typename _Res, typename... _ArgTypes, _Res (*f)(_ArgTypes...)>
struct wrapper<_Res(_ArgTypes...), f>
{
template <typename... Args>
_Res operator()(Args... args)
{
int common_arg;
_Res res = f(args..., &common_arg);
// common processing....

return res;
};
};

所以你可以如下定义和使用_f1_fN

wrapper<decltype(f1_v1), f1_v1> _f1;
wrapper<decltype(fN_v1), fN_v1> _fN;

std::cout << _f1(0.1) << std::endl;
std::cout << _fN(0.1, true, 'c') << std::endl;

如果你想定义_f1_fN如下

wrapper<f1_v1> _f1;
wrapper<fN_v1> _fN;

你需要一个 C++17 兼容的编译器和非类型模板参数的 auto 类型。

我没有 C++17 编译器,但我想 wrapper 应该定义如下

template <auto f>
struct wrapper
{
template <typename... Args>
_Res operator()(Args... args)
{
int common_arg;
_Res res = f(args..., &common_arg);
// common processing....

return res;
};
};

关于c++ - 基于类模板的包装函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43421270/

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