2016-04-15 5 views
3

ジェネリックプログラミングの精神で、私は次のコードを作成しました:それはテンプレート速記のように私には思えるので、私は、これは2つの異なる機能を生成し、静的のアドレスで伝えることができるものからautoをパラメータとして使用することに負の影響はありますか?

#include <iostream> 
#include <functional> 

class Functor 
{ 
public: 
    void operator()() 
    { 
     std::cout << "Functor operator called." << std::endl; 
    } 
}; 

void Function() 
{ 
    std::cout << "Function called." << std::endl; 
} 

void Call(auto & fp) 
{ 
    static int i; 
    std::cout << "Unified calling..." << &i << std::endl; 
    fp(); 
} 

int main(int argc, char ** argv) 
{ 
    Functor functor; 
    std::function< void() > function = Function; 

    std::cout << "Begin testing..." << std::endl; 
    Call(functor); 
    Call(function); 
    std::cout << "End testing." << std::endl; 

    return 0; 
} 


Compiled with: g++ main.cpp -std=c++14 
output: 
Begin testing... 
Unified calling...0x100402080 
Functor operator called. 
Unified calling...0x100402090 
Function called. 
End testing. 

に、並べ替えの。私の本能は、複数の関数よりも保守する関数が優れているということですが、非共有の静的変数に注意するだけでなく、複数の関数定義ではなく、これを貧弱な選択にする可能性があります。

+0

汎用ラムダでのみ使用できます...関数の場合、テンプレートを使用してください – WhiZTiM

+2

これは非標準的な拡張子です。テンプレートの省略形です。[C++ 17標準に追加される可能性が高い] http://stackoverflow.com/questions/25879705/is-auto-as-a-parameter-in-a-regular-function-a-gcc-4-9-extension)。 C++の一部ではありません。 – HostileFork

+2

@HostileFork C++にはない17。 – Barry

答えて

8

はい、あります。現在のC++標準では禁止されています。

void Call(auto & fp) 

は、標準準拠のコンパイラでのコンパイルエラーです。

-1

それは不可能だが、主な欠陥です。

autoはちょうど初期の時点での型推論を意味しています。これは「任意の」タイプではありません。したがって、autoをこのように使用すると、関数がテンプレートでなければならないことになります。 C++ 17ではこれが可能になり、実際にはautoパラメータが自動的に関数をテンプレートにします(個人的に私はこれを非常に混乱させますが、うーん)。しかし今のところ、いいえ。

+0

これは、generic lambdaのための* any *タイプです。 – SergeyA

+2

@SergeyA「コール」が一般的なラムダであった場合、どちらが適切でしょうか? – Barry

+0

@ SergeyA:そうではありません。推論されたタイプに置き換えられます。私が作ろうとしている点は(確かにかなりひどく)、「オート」は一部の初心者のようにそれ自体のタイプではないということです。オブジェクトは「自動」になることはできません。そして私は誤解がこの質問の中心にあることを強く疑う。 –

関連する問題