c++ - 解压模板模板函数的可变参数?

标签 c++ c++11

// some arbitrary function 
template<typename T>
void log( T&& obj )
{
    std::cout << obj << std::endl;    
}

// arbitrary transformation
template<typename T>
T convert(T&& obj) { 
     return obj; 
}

template<template <typename> typename F, typename... T>
void callOn( F<T> func,  ///  issue: what's the type of func?                 
             T&&... params)
{
    func(std::forward<T>(convert(std::forward<T>(params)))...);
}

int main()
{   
    callOn(log, -1, -2.0);      
     return 0;
}

这可能吗?

编译器提示:没有匹配的函数可用于调用“callOn(, ..>)”。为什么?

更新:假设 log 不是一元函数

template<typename T>
void log(T&& value) { std::cout << value << std::endl; }

template<typename First, typename... Rest>
void log(First&& f, Rest&&... rest)
{
    std::cout << f << ",";
    log(std::forward<Rest>(rest)...);
}

callOn 采用的类型“template”与日志类型不匹配?如何指定func的类型?

最佳答案

使用函数对象。这是一个可编译的示例:

#include <utility>
#include <iostream>

struct Log
{
    template<typename T> void operator()(T&& t) { 
        std::cout << t << std::endl; 
    }

    template<typename T, typename... Rest> void operator()(T&& t, Rest&&... rest)
    {
        std::cout << t << ", ";
        (*this)(std::forward<Rest>(rest)...);
    }
};

template<typename T>
T convert(T&& obj) {
     return obj;
}

template<typename F, typename... T>
void callOn(F funcobj, T&&... params)
{
    funcobj(std::forward<T>(convert(std::forward<T>(params)))...);
}

int main()
{
    callOn(Log(), -1, -2.17, "abc");
    return 0;
}

关于c++ - 解压模板模板函数的可变参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10321370/

相关文章:

c++ - 很多变量,没有嵌套循环的最佳方法

c++ - 错误 C3867 多线程 C++

c++ - 将模板函数声明为友元

c++ - 可以检索 C++11 中线程函数的返回值吗?

c++ - 使用 std::forward 的主要目的是什么以及它解决了哪些问题?

c++ - 将 boost::shared_ptr 与重载下标运算符 ([]) 的类一起使用

c++ - Google Mock - 如何使用 EXPECT_CALL 返回不同的值以退出循环

c++ - 推荐一个 C/C++ 中的 HTTP 解析库

c++ - 混淆段错误

c++ - 使用模板函数打印智能指针 vector