2016-04-04 10 views
-1

あなたが例えば名前のないパラメータはなぜ有用なのですか?

int func_useful(int a) { return a; } 

とは異なり、あなたは

を呼び出すことができ、入力として、名前のint型を取りますが、それを何もしません

int func_useless(int) { return 2; } 

のような関数を定義することができますなぜ私は混乱しています

int x = func_useless(3); // x is 2 

ここで、intをfunc_uselessに渡す必要がありましたが、結果は何もありません。

いつ使えないものを渡すのが役に立つのでしょうか?なぜこれは言語の機能ですか?

+0

、「なぜ便利無名のパラメータですか」? –

+1

も参照してください:http://stackoverflow.com/questions/12186698/on-unnamed-parameters-to-functions-c –

+0

この質問は重複していますが、「名前のないパラメータ」とは異なり、質問は実際には特定の質問です名前の付いていないパラメータの有用性は、なぜこれが有用であるかを理解しようとする人々に役立ちます。 – OrangeSherbet

答えて

0

どちらも便利だとは思えません。私はあなたがで取得している予期何

は最も厄介な解析である:

int main() 
{ 
    int funk1(); 
    int funk2(int()); 

    funk2(funk1); 
} 

これは宣言され、そして、あなたはここに名を必要としません。彼らはおそらく定義のポイントで命名されます。

編集:

は実際に私が使用を考えた:

my_callback

int whatnot() { return 6; } 

void somefun(int (*callback)(int())) 
{ 
    callback(whatnot); 
} 

int my_callback(int()) { return 42; } 

int main() 
{ 
    somefun(my_callback); 
} 
が必要か、関数のパラメータを使用しませんが、指定されたとして、それはコールバックインタフェースを遵守するために、それを受け入れる必要があります somefun

+0

これはまさにこの混乱の原因となっていました。特にスレッドに関数を渡す必要があるが、 'std :: thread t(constructor())のように宣言として解釈されます。 'vs' std :: thread t((コンストラクタ())) ' – OrangeSherbet

+0

thistにはたくさんの使い方があります。タグの発送とsfinae(そのうちの1つには化身)があります。 – SergeyA

1

ここではユースケースです。あなたは、機能を取る機能を持っており、それに何かを行います。

int sumFrom0To9(int *func(int)) { 
    int acc = 0; 
    for (int i = 0; i < 10; i++) { acc += func(i); } 
    return acc; 
} 

あなたはこのような何か、と言う、など、あなたが望む任意の単一引数関数に渡すことができます。

int identity(int) { return 1; } 
+1

私はその機能に 'identity'という名前をつけません...' one'が良いと思われます。 – Jarod42

0

名前関数のバイナリインタフェースを保持し(シグネチャを変更しない)、引数のための使用がなく、未使用の引数についてのコンパイラの警告をシャットダウンする場合は、パラメータを使用すると便利な場合があります。

2
  • コールバックインターフェイス。別のライブラリでは特定のシグネチャでコールバックする必要がありますが、コールバックは特定の引数の値を気にしません。
  • 引数の型だけを考慮し、その値は気にしない場合。

    • おそらく、そのタイプのすべての値が同等であるため、例えば、std::nullptr_t、またはタグタイプstd::allocator_arg_t又はstd::nothrow_t又はstd::piecewise_construct_tstd::input_iterator_tagまたは等。おそらく
    • 引数のみ、例えばオーバーロード解決を制御するために使用されているため:

      template<class T> 
      auto do_foo(const T& t, int) -> decltype(t.foo()) { return t.foo(); } 
      template<class T> 
      void do_foo(const T& t, long) { /* default implementation */ } 
      
      // call t.foo() if valid, otherwise provide a default implementation 
      template<class T> 
      decltype(auto) foo(const T& t) { return do_foo(t, 0); } 
      

      do_fooの2番目のパラメータの値は重要ではありません。これは、do_fooの両方が有効な場合は、最初の方を優先して、do_foo(t, 0)コールのオーバーロード解決を制御するためにのみ使用されます。

      同じように、operator++()(接頭辞)とoperator++(int)(接尾辞)とそれらの--があります。接尾辞++/--の実装は、intパラメータの値を気にすることはめったにありません。接頭辞と接尾辞をあいまいにするために存在します。

+0

SFINAEのいくつかの実装も同様です。 – SergeyA

1

1つの使用テンプレートプログラミングで有用な技術であるタグ・ディスパッチ、次のとおりです。だから、

#include <iostream> 

struct ping_type {}; 
struct pong_type {}; 

static constexpr ping = ping_type {}; 
static constexpr pong = pong_type {}; 

void action(ping_type) { 
    std::cout << "ping" << std::endl; 
} 

void action(pong_type) { 
    std::cout << "pong" << std::endl; 
} 

int main() 
{ 
    action(ping);  
    action(pong); 
} 
関連する問題