0

I was testing some features of c++ with varargs when I eventually got blocked by a macro call.

First, I have a class :

class TestManager
{
public:
    void            assertTestSeq(int n, ...);
    [...]

And I want to be able to call this method, without having to bother about n (number of varargs). So, I copied from internet, that macro which counts the number of arguments:

#define NUMARGS(...)            NUMARGS_IMPL_((__VA_ARGS__, 63,62,61,60,59,58,57,56,55,54,53,52,51,50,49,48,47,46,45,44,43,42,41,40,39,38,37,36,35,34,33,32,31,30,29,28,27,26,25,24,23,22,21,20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1))
#define NUMARGS_IMPL_(tuple)    NUMARGS_IMPL tuple
#define NUMARGS_IMPL(_1,_2,_3,_4,_5, _6, _7, _8, _9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,N,...) N

Finally, I decided to create a macro to handle the counting:

#define assertSeq(...)      (TestManager::*assertTestSeq(NUMARGS(__VA_ARGS__), __VA_ARGS__))

And tried to call it:

this->assertSeq(randomSheit1, randSht2);

BUT ... well, I don't know how to declare my assertSeq macro and then, I don't know how to call it either. Can you tell me if this could be done somehow and how?

KwentRell
  • 416
  • 1
  • 4
  • 17

1 Answers1

2

The easiest way is with variadic templates:

template<typename Args...> void assertSeq(Args&&... args) {
  asserTestSeq(sizeof...(args), std::forward<Args>(args)...);
}

The complicated-looking && and std::forward stuff is to enable perfect forwarding. Other than that, sizeof... gives the size of an argument pack, and the second parameter is unpacking said pack in the same manner in which it was given to assertSeq.

Wintermute
  • 42,983
  • 5
  • 77
  • 80
  • I already tried it, without success, but I think it's because I'm using VS2012... I have to switch to VS2013 to test this c++11 feature. – KwentRell Dec 22 '14 at 14:36
  • 1
    I think to use this with VS2012, you need the [November 2012 CTP](http://www.microsoft.com/en-us/download/details.aspx?id=35515). – Wintermute Dec 22 '14 at 15:25
  • I saw your last comment a bit late. However I managed to install VS2013 and this is working WELL. Very happy about it, a bit less happy about the syntax of variadic templates. But at least, one can now get rid of a few old sneaky macros. – KwentRell Dec 23 '14 at 15:11