2016-04-18 24 views
-1

std::functionメンバーとoperator()というメンバーを呼び出すクラスを作成しようとしています。ここに私が試したものです:std :: functionをカプセル化する方法

template <class R, class... Args> 
class Func{ 
    public: 
    Func(std::function<R(Args...)> fnx) : fn(fnx) {} //Error 
    R operator()(Args... a) { return fn(a...); }  //Error 
    private: 
    std::function<R(Args...)> fn;     //Error 
}; 

しかし、私は私がいずれも表示されない---神秘的なエラーに私は理解していないことをErrorとして示さラインで

error: function returning a function

を取得関数が返されます。どこにありますか、どのように修正できますか?

フルに動作していない例:Args...が空の間、このラインで http://coliru.stacked-crooked.com/a/603a84184d9666a8

#include <iostream> 
#include <functional> 

int foo(int a, int b) { return a+b; }  

template <class R, class... Args> 
class Func{ 
    public: 
    Func(std::function<R(Args...)> fnx) : fn(fnx) {} 
    R operator()(Args... a) { return fn(a...); } 
    private: 
    std::function<R(Args...)> fn; 
}; 

Func<int(int,int)> foox; 

int main() { 
    std::cout << foox(2,4); 
    return 0; 
} 
+1

参照してください:私はMCVEを含まなかった – cubuspl42

+0

http://stackoverflow.com/help/mcveを、私はしませんでしたか? – CygnusX1

+0

まあ、そうではありません。クラスそのもののコード自体は問題なく、それは質問に含まれるコードだけでした。私はエラーを見つけるために外部サイトに行く必要があった。私が理解しているように、外部サイトへのリンクは追加するだけですが、最小限の作業例は質問自体の一部でなければなりません。今やちょっと修正されました(ただし、コードを複製する必要があるかどうかはわかりません)。 – cubuspl42

答えて

0

私はあなたがこのような何かをしたいと思います。他の面では
は、ここにあなたのコード例は、一度固定されている:

#include<functional> 
#include<iostream> 

int foo(int a, int b) { return a+b; } 

template<typename F> 
class Func; 

template<typename R, typename... Args> 
class Func<R(Args...)> { 
public: 
    Func(std::function<R(Args...)> fnx) : fn(fnx) {} 
    R operator()(Args... a) { return fn(a...); } 
private: 
    std::function<R(Args...)> fn; 
}; 

Func<int(int,int)> foox{foo}; 

int main() { 
    std::cout << foox(2,4); 
    return 0; 
} 
+0

あなたは絶対に正しいです、これは私が達成したかったものです。 'Func 'はそれ自身で動作するもので、一般的な 'F'の特殊化として宣言する必要はありません。 – CygnusX1

+0

Downvoters、なぜ? – skypjack

+0

質問自体も下降表示されます。問題は基本的なものかもしれませんが、私は本当にそれがなぜそのように投票されたのか分かりません。 – CygnusX1

2

...

Func<int(int,int)> foox

...あなたは、Rとしてint(int,int)を渡しています。エラーがクランでより明白である:

a.cpp:9:24: error: function cannot return function type 'int (int, int)' 
    Func(std::function<R(Args...)> fnx) : fn(fnx) {} 
        ^
a.cpp:15:20: note: in instantiation of template class 'Func<int (int, int)>' requested here 
Func<int(int,int)> foox; 
       ^
a.cpp:10:5: error: function cannot return function type 'int (int, int)' 
    R operator()(Args... a) { return fn(a...); } 
    ^
a.cpp:12:19: error: function cannot return function type 'int (int, int)' 
    std::function<R(Args...)> fn; 
       ^

fooxを宣言する正しい方法はFunc<int, int, int> foox;だろう。

+1

正しい方法があるかもしれませんか? 'Func foox;' – juanchopanza

+2

動作しても、OPで意図したとおりの*正しい方法ではないと思われます。 – skypjack

+0

@skypjackこの疑惑があなたにこの答えをdownvoteしてくれないことを願っています:P – cubuspl42

0

fooxの正しい宣言(前述のcubuspl42のような)のほかに、必要なfoo関数をコンストラクタ引数として渡すこともできます。

完全なコード:

template<typename F> 
class Func; 

template<typename R, typename... Args> 
class Func<R(Args...)> { 
    // ... 
}; 

そうでない場合、あなたはそれを定義しFunc方法を悪用されています

#include <iostream> 
#include <functional> 

int foo(int a, int b) { return a+b; }  

template <class R, class... Args> 
class Func{ 
private: 
    std::function<R(Args...)> fn; 
public: 
    Func(std::function<R(Args...)> fnx) : fn(fnx) {} 
    R operator()(Args... a) { return fn(a...); } 

}; 

int main() { 
    Func<int, int, int> foox(foo); 
    std::cout << foox(2,4); 
    return 0; 
} 

`` `

+1

私はOPが彼の関数を 'Func ' >のようになります。 – skypjack

+0

@skypjack OPに質問してみませんか? – juanchopanza

+0

ああ、右の引数をコンストラクタに渡すことは正しいです。私はおそらく、現在のものがなくなるとその問題を見つけるだろう。 – CygnusX1

関連する問題