参数列表中的元组

时间:2015-03-21 20:55:11

标签: c++ c++11 variadic-templates

我写了一个远程调用程序包装器.. 在服务器端,我有一些人类可读的界面,例如:

template<typename TBase>
class LogicUnit : TBase
{
public:
  int getLenFromCalculate(
    double antenaForce, const std::string & duration) IMPLEMENTATION;

  float calcSomeAlse(
    int tableW, float integral) IMPLEMENTATION;
};

从客户端我希望像这样使用它:

#define IMPLEMENTATION TUPLE_FROM_ARGS
#include "logicUnit.h"
#undef 

LogicUnit<ClientNetwork> logicUnit;
logicUnit.connect("10.123.123.123", "8080");
logicUnit.getLenFromCalculate( 20.032, "faster" );

ClientNetwork我有一个辅助函数:

template< typename ... Args >
bool send( const std::string & funcName, std::tuple<Args...> tuple );

我的问题 - 我可以用TUPLE_FROM_ARGS-macros写什么?我想要以下内容:

define TUPLE_FROM_ARGS send( __FUNCTION__, std::make_tuple( ??????? ) );

或者我如何以另一种方式解决我的问题? 在这个图书馆http://code.google.com/p/simple-rpc-cpp/ 使用脚本生成器创建IMPLEMENTATION代码。但我想,是否可以使用模板和宏。

2 个答案:

答案 0 :(得分:2)

看起来你正在寻找一个可变的宏:

#define TUPLE_FROM_ARGS( ... ) \
    send( __FUNCTION__, std::make_tuple( __VA_ARGS__ ) );

如果您不清楚自己真正需要什么,那么很难给出好的建议。学会写好SSCCE的。无论如何,也许你正在寻找这个:

template< typename... Args >
int getLenFromCalculate( Args&&... args )
{
    send( __FUNCTION__, std::make_tuple( std::forward< Args >( args )... ) );
}

(在上面我真的不再需要宏了)

答案 1 :(得分:0)

- 继续我的问题 -

我有类成员的定义:

class LogicUnit
{
public:
  RPC_FUNC_BEGIN
      int getLenFromCalculate(double antenaForce, const std::string & duration);
  RPC_FUNC_END
};

在客户端,它是一些实现,在服务器端,它是另一个实现。例如:

// LogicUnit_c.h
int LogicUnit::getLenFromCalculate( double _1, const std::string & _2 )
{
    return send(__COUNTER__, _1, _2);
}

// LogicUnit_s.h
int LogicUnit::getLenFromCalculate( double antenaForce, const std::string & duration )
{
   return (int)(duration.length() * antenaForce);
}

如果我有很多成员,我会写下一个模板代码:

int Foo::fooBar( double _1, int _2 ) { return send(__COUNTER__, _1, _2); }
void Foo::someQwe( double _1, int _2 ) { return send(__COUNTER__, _1, _2); }
int Foo::getParam( const std::string & _1 ) { return send(__COUNTER__, _1); }
void Foo::beNext( int _1, float _2, SMyStruct _3 ) { return send(__COUNTER__, _1, _2, _3); }

我需要__PRETTY_FUNCTION__之类的东西: How to get function signature via preprocessor define written before it?