2015-09-17 2 views
1

Я хочу создать свою собственную библиотеку модульного тестирования, где я хотел бы настроить тестовые случаи следующим образом:Объявление VARIADIC шаблонов указателя на функцию-членов

template <typename... Args> 
std::string concatenate(Args&&... args); 

class my_test : public unit_test::test { 
public: 
    my_test(int i, float f, double d) : i_(i), f_(f), d_(d) { } 
    void test1() { assert_true(i_ % 5 == 0, concatenate("i(", i_, ") not divisible by 5")); } 
    void test2() { assert_true(i_ > 0, concatenate("i(", i_, ") not greater than 0")); } 
    void test3() { assert_true(i_ % 2 == 0, concatenate("i(", i_, ") not divisible by 2")); } 
private: 
    int i_; 
    float f_; 
    double d_; 
}; 

int main() 
{ 
    unit_test::test_case<my_test, 
     &my_test::test1 
     &my_test::test2 
     &my_test::test3> my_test_case; 
    result r = my_test_case(1, 1.0f, 1.0); 
} 

Чтобы иметь возможность определить класс шаблона test_case, мне нужно чтобы иметь возможность объявить VARIADIC шаблоны указателей на функции-члены:

class result { 
    unsigned int num_failures_; 
    unsigned int num_tests_; 
}; 

template <typename Test, void(Test::*...MemFns)()> 
class test_case; 

к сожалению, г ++ - 4,8 и выше, дает следующее сообщение об ошибке:

main.cpp:137:52: error: template argument 3 is invalid 
class test_case <Test, &Test::First, &Test::...Rest> { 
                ^
main.cpp: In function 'int main(int, char**)': 
main.cpp:194:28: error: template argument 2 is invalid 
      &my_test::test3>()(1, 1.0f, 1.0); 

И удивительно, что g ++ - 4.7 компилирует и запускает недопустимый код!

Каков правильный способ объявления вариативных шаблонов указателя на функции-члены?

Here is the full code

ответ

1

Изменение:

template <typename Test, void(Test::*First)(), void(Test::*...Rest)()> 
class test_case <Test, &Test::First, &Test::...Rest> 

в:

template <typename Test, void(Test::*First)(), void(Test::*...Rest)()> 
class test_case <Test, First, Rest...> 

Как:

test_case<Test, &Test::...Rest>()(args...); 

в:

test_case<Test, Rest...>()(args...); 
+0

Piotr, почему g ++ - 4.7 не дает синтаксической ошибки '& Test :: ... Rest'? И как он может построить что-то, что на самом деле является синтаксической ошибкой? –

Смежные вопросы