2
// 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(, ..>) への呼び出しに一致する関数がありません。なんで ?

更新: ログが単項関数ではないと仮定します

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 は、ログのタイプと一致しないタイプ「テンプレート」を取りますか? 関数の種類を指定するには?

4

2 に答える 2

2

関数オブジェクトを使用します。コンパイル可能な例を次に示します。

#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;
}
于 2012-04-25T22:02:57.840 に答える
1

の構文が正しいとは思いませんtemplate <typename> typename F。Standard は 14.3.3/1 で、「テンプレート テンプレート パラメータのテンプレート引数は、関数テンプレートではなく、クラス テンプレートまたはエイリアス テンプレートの名前でなければならない」と指定しています。 . 関数テンプレートを渡したい場合は、パラメーターを関数へのポインターとして宣言できます。

template<typename... T>
void callOn( void (*func)(T&&...params),
             T&&... params)
{
    //same as before
}

callOn(log, -1, -2.0);呼び出されると、 の型は{-1, -2.0} からではなく、{int, double} からT推定され、が指すポインタから初期化されます。logfunclog<int, double>(int&&, double&&)

于 2012-04-26T05:55:53.267 に答える