私は別の関数を呼び出してその名前を出力し、その結果を扱いたいという関数を持っています。それは正常に動作します&nameとnameとして関数を渡すのがなぜ異なるポインタですか?
#include <iostream>
#include <string>
#include <map>
std::map<void *, std::string> ptr_map;
#define IS_API_CALL(fun) ptr_map[fun] = __FUNCTION__;
int api_call_bar(double x) {
IS_API_CALL(&api_call_bar);
return 0;
}
std::string getFuncNameByPtr(void * addr) {
for (auto it = ptr_map.begin(); it != ptr_map.end(); ++it) {
if (it->first == addr) return it->second;
}
return "???";
}
template <typename... Args>
void api_exec(int func(Args...), Args... args) {
func(args...);
auto name = getFuncNameByPtr(func); // <-- HERE. &func doesnt work
std::cout << name << " was called\n";
}
int main() {
api_exec(&api_call_bar, 2.0);
}
この1つは、api_call_bar was called
を正常に印刷します。私にとって興味深い部分は、<-- HERE
というマークが付けられています。 &func
として渡すと正しく動作しません(名前はマップ内のポインタによって見つかりません)。それはなぜそうですか?私はそれがまったく同じであるべきだと思います。
_ "私はそれがまったく同じであるべきだと思います。" - それはなぜですか?なぜ関数ポインタを 'void *'に変換して戻ってきたのですか?私はそれが許されているかどうか覚えていません。それ自体はそれをしない十分な理由です。 &funcとfuncは同じポインタを評価する必要があるため、 –
@ LightnessRacesinOrbit?いいえ? –
あなたはマップの機能を使用していません... –