0

dlopen()Windows でまたはを使用して動的ライブラリをロードし、LoadLibrary()そこからシンボルを取得して特定の関数型にキャストしたいとします。型を 2 回記述するのは信じられないほど冗長です!

void (*Test)(int, float) =
        reinterpret_cast<void (*Test)(int, float)>(dlsym(handle, "Test"));

コードを C++11 標準なしでコンパイルできるようにしたいので、autoキーワードはオプションではありません。コンパイラは与えられたパラメータからテンプレート パラメータを検出できることが多いため、テンプレートを使用してみましたが、代入値の型に対しては機能しないようです。

template <typename T>
T GetSym(void* handle, const char* symbol) {
    return (T) dlsym(handle, symbol);
}

void (*Test)(int, float) = GetSym(handle); // does not compile

コードの冗長性を減らす方法はありますか? 動的にロードされたライブラリから膨大な数の関数を取得する場合、すべてのキャストを 2 回記述するのは大変なことです。

4

1 に答える 1

2

これは、テンプレート化された邪悪な変換演算子を使用して行うことができます。

struct proxy {
public:
    proxy(void* ptr) : ptr(ptr) {}

    template <typename T>
    operator T() const {
        return reinterpret_cast<T>(ptr);
    }
private:
    void* ptr;
};

proxy GetSym(void* handle, const char* symbol) {
    return proxy(dlsym(handle, symbol));
}
于 2013-10-31T13:43:33.390 に答える