Я хочу создать свою собственную библиотеку модульного тестирования, где я хотел бы настроить тестовые случаи следующим образом:Объявление 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 компилирует и запускает недопустимый код!
Каков правильный способ объявления вариативных шаблонов указателя на функции-члены?
Piotr, почему g ++ - 4.7 не дает синтаксической ошибки '& Test :: ... Rest'? И как он может построить что-то, что на самом деле является синтаксической ошибкой? –