将可变参数函数模板参数传递给另一个函数

时间:2014-06-29 01:38:20

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

我正在尝试将我的包传递给另一个函数,它看起来与我在教程中看到的类似,但显然不够相似:

class algorithm
    {
        typedef uint64_t time_type;
    protected:
        std::string name;
        time_type result;

        template <typename... Args>
        void execute(const Args&...);

    public:
        algorithm(std::string name);

        //virtual void prepareTest()=0;
        template <typename TimeT, typename... Args>
        void beginTest(const Args&...);
        void printResult();
        time_type getResult();

    };

    template <typename TimeT, typename... Args>
    void algorithm::beginTest(const Args&... args)
    {
        auto start = chrono::high_resolution_clock::now();

        execute(args...);

        auto duration = chrono::duration_cast<TimeT>
                    (chrono::high_resolution_clock::now() - start);

        result = duration.count();
    }

    template <typename... Args>
    void execute(const Args&... args)
    {
        //nothing here yet
    }

当我实例化一个算法和beginTest()时,我收到一个链接器错误:

const int n = 100000;
const int m = 1000;
algortest::algorithm brutus("brutus");
brutus.beginTest<chrono::milliseconds>(n, m);
  

架构x86_64的未定义符号:&#34; void   algortest :: algorithm :: execute(int const&amp;,int const&amp;)&#34;,   引自:         void algortest :: algorithm :: beginTest&gt;,int,int&gt;(int const&amp;,int const&amp;)in   main.o ld:找不到架构x86_64的符号

我做错了什么?是否可以在派生类算法中覆盖execute()?

1 个答案:

答案 0 :(得分:2)

您忘记在execute的定义前加algorithm::全部为: - )

应该是:

template <typename... Args>
void algorithm::execute(const Args&... args)
{
    // ...
}

你可能还想为你的参数使用完美转发而不是强制它们通过引用传递 - 而不是const Args&...,在调用时使用Args&&...然后std::forward<Args>(args)...功能