2016-12-28 15 views
-3

私は、このクラスがあるとします。クラスに関数を渡す

template<class K, class func1, class func2> 
class findMax { 
    K* key; 
    func1 cmp; 
    func2 areSame; 
}; 

template<class K, class func1, class func2> 
findMax<K, func1, func2>::findMax(K n, func1 isValid, func2 areSameFunc) { 

    cmp = isValid; 
    areSame = areSameFunc; 
} 

は、どのように私は、このクラスのインスタンスを作るのですか?
私が試してみました:

typedef bool (*someFunc)(int); 
typedef bool (*someFunc2)(int, int); 

findMax<int, someFunc, someFunc2> u(7, isValid, areSame); // Doesn't compile, error below. 

エラーメッセージ:

Invalid arguments ' 
Candidates are: 
findMax(const findMax<int,bool (*)(int, int),bool (*)(int)> &) 
findMax() 
findMax(int, #10000, ?, ?) 
' 

bool isValid (int k) { 
    return (k>0); 
} 

bool areSame (int key, int key2) { 
    return key==key2; 
} 

しかし、これは動作しませんが。他のアプローチも試みましたが、これを行う方法が見つかりませんでした。
どうしたらいいですか?

+1

どうしますか? – Carcigenicate

+0

@Carcigenicate申し訳ありません、追加されました。 – SomeoneWithAQuestion

+0

@SomeoneWithAQuestion C++コードで 'std :: function'を使います。 –

答えて

1

コンストラクタの宣言/定義と、おそらくメンバーの宣言をソートする必要があります(おそらくポインタではなく値でなければなりません)。これで、オブジェクトを作成するのは簡単です。

個人的には、私は実際にテンプレート引数を指定するのではなく、適切なファクトリ関数を作成します。例:

template<typename K, typename Fun1, typename Fun2> 
class findMax { 
    K  key; 
    Fun1 cmp; 
    Fun2 areSame; 
public: 
    findMax(K n, Fun1 isValid, Fun2 areSameFunc) 
     : key(n) 
     , cmp(isValid) 
     , areSame(areSameFunc) { 
    } 
}; 

template<typename K, typename Fun1, typename Fun2> 
findMax<K, Fun1, Fun2> makeFindMax(K n, Fun1 fun1, Fun2 fun2) { 
    return findMax<K, Fun1, Fun2>(n, fun1, fun2); 
} 

bool isValid (int k) { 
    return (k>0); 
} 

bool areSame (int key, int key2) { 
    return key==key2; 
} 

int main() { 
    auto obj = makeFindMax(7, isValid, areSame); 
} 
+0

答えをありがとう。 findMaxは実際にヘッダーファイルにあり、残りのコードはソースファイルにあります。新しい 'findMax'を作成するために私のソースファイルから別の関数を呼び出さなくても、これを行うことができる方法はありますか? – SomeoneWithAQuestion

+0

@SomeoneWithAQuestion:ヘッダにファクトリ関数を宣言することには何も問題ありません。しかし、コンストラクターを正しく定義したら、 'makeFindMax()'のように呼び出すことができます。 –

関連する問題