gpt4 book ai didi

c++ - 如何将几乎任何东西传递给 C++(或 C)中的函数?

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

我需要传递类似指针的东西,将任何东西作为函数参数。你知道,一些没有任何预定义类型或可以接受这样的类型的东西:

 void MyFunc( *pointer ); 

然后像这样使用它:

char * x = "YAY!";
MyFunc(x);

int y = 10;
MyFunc(&y);

MyObj *b = new MyObj();
MyFunc(b);

而且我不想使用模板,因为我在我的项目中主要使用 C。除了函数宏之外,这里还有什么可以使用的吗?

最佳答案

在 C++ 中,Boost.Any将使您以类型安全的方式执行此操作:

void func(boost::any const &x)
{
// any_cast a reference and it
// will throw if x is not an int.
int i = any_cast<int>(x);

// any_cast a pointer and it will
// return a null pointer if x is not an int.
int const *p = any_cast<int>(&x);
}

// pass in whatever you want.
func(123);
func("123");

在 C 中,您将使用空指针:

void func(void const *x)
{
// it's up to you to ensure x points to an int. if
// it's not, it might crash or it might silently appear
// to work. nothing is checked for you!
int i = *(int const*)x;
}

// pass in whatever you want.

int i = 123;
func(&i);

func("123");

您似乎不喜欢它,但我还是会推荐它:如果您使用的是 C++,请接受它。不要害怕模板。像 Boost.Any 和 void 指针这样的东西在 C++ 中有一席之地,但它非常小。

更新:

Well , I am making a small signals - slots - connections library to be used with my gui toolkit. So that I can get rid of the Ugly WNDPROC. I need these pointers for the connections.

如果您需要多目标信号,Boost.Signals已经提供了完整且经过测试的信号/插槽实现。您可以使用 Boost.Bind (或者 std::bind,如果你有 C++0x 编译器)连接成员函数:

struct button
{
boost::signal<void(button&)> on_click;
}

struct my_window
{
button b;

my_window()
{
b.on_click.connect(std::bind(&my_window::handle_click,
this, std::placeholders::_1));
}

void handle_click(button &b)
{
}

void simulate_click()
{
b.on_click(b);
}
};

如果你只想要一个简单的回调,Boost.Function (或者 std::function 如果你有一个 C++0x 编译器)将工作得很好:

struct button
{
std::function<void(button&)> on_click;
}

struct my_window
{
button b;

my_window()
{
b.on_click = std::bind(&my_window::handle_click,
this, std::placeholders::_1);
}

void handle_click(button &b)
{
}

void simulate_click()
{
b.on_click(b);
}
};

关于c++ - 如何将几乎任何东西传递给 C++(或 C)中的函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6880920/

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