【问题标题】:C++ making a console: binding a functionC++ 制作控制台:绑定函数
【发布时间】:2013-04-25 17:29:13
【问题描述】:

我目前正在用 C++ 创建一个控制台。我创建了一个类来帮助将代码中的变量和函数链接到控制台中的变量和函数。

我目前已将它设置在哪里,如果我在代码中有一个变量,我可以在新类下重新定义它,它将对控制台可见。代码中的变量的行为仍然与以前相同。

例子:

float var = 1.0;

可以重新定义为

ConsoleVar var("myVariable")<float> = 1.0;

var 是代码中的变量名,myVariable 是您在终端中用来访问它的名称

我的问题是:

如何绑定函数,或者更具体地说,如何检测参数的数量和类型。 我知道我可以将ConsoleVar 类模板化为void * 类型来存储函数,但是有没有办法让我自动检测返回类型、参数数量和参数类型?我打算把它放在图书馆里,所以我要方便使用。如果这是可能的,我真的很想知道(如果需要,我什至会进行组装)否则我对如何实现它有一些想法。

编辑:所以我认为我有一个解决方案,但我有一个问题......是否可以将可变数量的参数传递给函数。不像可变参数。

例如:我从命令行收到 3 个参数,现在我执行函数

func(arg[1], arg[2], arg[3])

是否可以发送可变数量的参数?

【问题讨论】:

  • 你知道你的函数类型有什么限制吗?您希望int printf( const char *, ... ) 检测什么?
  • 只有基本的 C 类型,如果可能的话,用户定义的类。没有变长函数。
  • 没有办法从void* 到类型信息。你的问题的意思也远不清楚。例如,绑定一个函数是你可以做的事情,例如Boost.Bind,但是如果你想知道用例(写一个“控制台”,不管你的意思是什么)是无关紧要的。同样,“将 ConsoleVar 类模板化为 void*” - 我真的不确定你的意思。最后,不应该是ConsoleVar<float> var("myVariable", 1.0);吗?我无法想象任何允许您的代码编译的 ConsoleVar 定义...
  • 即使你知道类型签名,你会如何处理你的函数?您是否希望控制台能够调用它?
  • @doomster 我使用运算符重载将数字分配给类

标签: c++ function console


【解决方案1】:

这种模式可以胜任。

#include <typeinfo>    

// Function with 0 parameters
template< typename Ret >
void examine_function( Ret (*func)() )
{
    std::cout << typeinfo(Ret).name() << std::endl;
}

// Function with 1 parameters
template< typename Ret, typename Param1 >
void examine_function( Ret (*func)(Param1) )
{
    std::cout << typeinfo(Ret).name() << std::endl;
    std::cout << typeinfo(Param1).name() << std::endl;
}

// Function with 2 parameters
template< typename Ret, typename Param1, typename Param2 >
void examine_function( Ret (*func)(Param1, Param2) )
{
    std::cout << typeinfo(Ret).name() << std::endl;
    std::cout << typeinfo(Param1).name() << std::endl;
    std::cout << typeinfo(Param2).name() << std::endl;
}

【讨论】:

  • ... 然后根本不将其转换为 void* 。在数据和函数之间转换指针是未定义的行为。
  • 我想我有办法了!如果有人感兴趣,我可以在完成后发布代码
猜你喜欢
  • 2013-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-08
  • 1970-01-01
相关资源
最近更新 更多