gpt4 book ai didi

c++打包和解包参数包以在没有STL的情况下调用匹配的函数指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:08:29 24 4
gpt4 key购买 nike

我正在尝试创建一个类,该类将存储指向具有可变数量参数的函数的指针,并在稍后调用它。

想法是为函数创建一个包装器,该函数将在对象析构时调用所述函数。这样我就可以确保在退出某些功能后进行一些清理。

我现在拥有的是 Faheem Mitha 发布的一点修改代码 here .

这是带有示例的工作代码(我正在使用 Visual Studio 2015 编译它):

#include "stdafx.h"
#include <tuple>
#include <iostream>

using namespace std;

template<int...> struct seq {};

template<int N, int... S> struct gens : gens<N - 1, N - 1, S...> {};

template<int... S> struct gens<0, S...> { typedef seq<S...> type; };

template<typename Return, typename... Args> class CallOnExit
{
Return(*_func)(Args...);
std::tuple<Args...> _args;

template<int... S> Return call_func(seq<S...>)
{
return _func(std::get<S>(_args)...);
}
Return call()
{
return call_func(typename gens<sizeof...(Args)>::type());
}
public:
CallOnExit(Return(*func)(Args...), Args&&... args)
{
_func = func;
_args = std::forward_as_tuple(args...);
}
~CallOnExit()
{
if (_func != nullptr)
call();
}
};

void f(int i, double d)
{
cout << i << endl << d << endl;
}

int main()
{
{
CallOnExit<void, int, double> c(f, 1, 2);
}
cin.get();
return 0;
}

问题是我必须在 STL 不可用的 Arduino 平台上进行这项工作(因此没有 std::tuple,没有 std::forward,没有 std::get)。 Arduino 支持 C++11。

使这个示例在没有 STL 的情况下工作所需的最少工作量是多少?

最佳答案

The idea is to create a wrapper for function that will call said function when the object destructs. That way I can for example ensure some cleanup happens after exiting some function.

您尝试使用的代码似乎有点经过深思熟虑,或者至少是为某些其他特定用途量身定制的。对于上面的引述,这里是我将如何使用 lambda 和简单函数完成任务。

现在调用可以随心所欲地自定义,并且实现仍然很简单:

template< typename T > struct TRef{
TRef(T &in) : t(in) {}
~TRef(){ t(); }
T t;
};

template< typename T > TRef<T> RunOnExit(T t){
return TRef<T>( t );
}

void setup() {
Serial.begin(9600);
}

void loop() {
int a = 3, b = 4;
auto test = RunOnExit( [](){ func(1, 2); } );
{
auto test1 = RunOnExit( [&a, &b](){ func(a, b); } );

}
}

void func( int a, int b){
auto pause = RunOnExit( wait );
Serial.print( a, HEX );
Serial.print( ", " );
Serial.println( b, HEX );
}

void wait(){ delay(500); }

关于c++打包和解包参数包以在没有STL的情况下调用匹配的函数指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36200295/

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