c++ - 声明指向成员函数的可变参数模板

标签 c++ unit-testing c++11 g++ variadic-templates

我想构建我自己的单元测试库,我想在其中设置测试用例如下:

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 模板类,我需要能够声明指向成员函数的指针的可变参数模板:

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

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

不幸的是,g++-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

最佳答案

改变:

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...);

关于c++ - 声明指向成员函数的可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32632323/

相关文章:

c++ - SIOD : ran out of storage in festival

c++ - 在 switch-case 中创建一个对象

python - 单元测试使用 subprocess.Popen 的 Python 代码

typescript - 如何在 JestJs 中对 TypeScript 类的构造函数中抛出的异常进行单元测试

ios - 为什么具有单个 Cocoapod 依赖项的样板 Cocoa Touch Framework 项目中的样板单元测试甚至没有运行就失败了?

c++ - 参数列表中的模板方法 "=0"

c++ - ClockTimer 以秒或毫秒显示值?

构造函数中的c++参数包规范而不是模板

c++ - 'auto const' 和 'const auto' 是一样的吗?

c++ - 是否可以通过 using namespace 重用变量名?