したがって、関数としてパラメータを取る2つの汎用クラスがあります。 1つは関数ポインタをとり、もう1つはstd ::関数をとります。どちらもテンプレートパラメータを持っています。関数のポインタとstd :: functionを引数としてテンプレート化されたパラメータを持つ関数を渡す
#include <functional>
#include <memory>
namespace {
void example(const std::shared_ptr<const int>&) {}
}
class Generic {
public:
Generic() {}
virtual ~Generic() {}
template <typename Targ>
void doWork(std::function<void(const std::shared_ptr<const Targ>&)> arg) {}
template <typename Targ>
void doWork2(void(*function)(const std::shared_ptr<const Targ>&)) {}
};
class Special : public Generic {
public:
Special() {
//doWork(&example); // Fail!
doWork<int>(&example); // OK!
std::function<void(const std::shared_ptr<const int>&)> func = &example;
doWork(func); // OK!
doWork2(&example); // OK!
}
};
int main(int argc, char** argv) {
Special special;
return 0;
}
関数ポインタでは、関数はコンパイルされますが、std ::は機能しません。ここでテンプレート控除が失敗するのはなぜですか?
クランレポート:
example.cpp:27:9: error: no matching member function for call to 'doWork'
doWork(&example);
^~~~~~
example.cpp:14:10: note: candidate template ignored: could not match 'function<void (const shared_ptr<const type-parameter-0-0> &)>' against 'void (*)(const std::shared_ptr<const int> &)'
void doWork(std::function<void(const std::shared_ptr<const Targ>&)> arg) {
^
1 error generated.
'example'は' std :: function'ではなく、潜在的にこの関数からいくつかの 'std :: function'を構築することができます。 – Jarod42
@ Jarod42しかし、 '&example'は関数ポインタです。関数ポインタを' std :: function'として渡すことはできますか? – Chris