2

私は c++11 (g++ バージョン 4.7) と c++0x (icpc 12.something、インテル c++ コンパイラー) をターゲットにしています。いつかclangを使うかもしれません。

次のデータ構造があります。

template<typename mydata_t>
struct mystruct {
    template<typename mycmp_t,
             int (*cmp)(const mydata_t &, const mycmp_t &)
             >
    void insert(const mydata_t &value, const mycmp_t &key) {
        // use key to search for where to put value, by calling
        // cmp(item_already_in_mystruct, key);
    }
};

アイデアは、クライアントができるということです

int double_double_compare_fun(const double &d1, const double &d2) { ...; }
int double_int_compare_fun(const double &d, const int &i) { ...; }
int main(void) {
    struct mystruct<double> s;
    s.insert<double, double_double_compare_fun>(4.2, 4.2);
    s.insert<int, double_int_compare_fun>(6.2, 6);
}

またはそれほどばかげたこと。

私は現在これを機能させていますが、それほどクレイジーではありません。しかし、私はもっとうまくやれることを望んでいます。

double_double_compare_funそして、double_int_compare_funすでに2番目のパラメーターの型に名前を付けています。したがって、頭の中で、コンパイラに最初のテンプレート引数を に推論させる方法があると思いますinsert。言っていただけると幸いです

s.insert<double_double_compare_fun>(4.2, 4.2);
s.insert<double_int_compare_fun>(6.2, 6);

mycmp_tのシグネチャcmpまたは の型から推測されていますkeymycmp_tまたは、 2 番目のパラメーターの型を にデフォルト設定できれば幸いですcmp

このテーマのバリエーションを試してみましたが、うまくいきませんでしたが、直感が得られることを願っています:

template<template<typename mycmp_t>
         int (*cmp)(const mydata_t &, const mycmp_t &)
         >
void insert(const mydata_t &value, const mycmp_t &key);

(私に与えますexpected 'class' before '(' token, expected identifier before '(' token, expected '>' before '(' token)。次のようなテンプレートを使用することも想像しましたが、署名の現在は(まだ)定義されていないなどと書かれていますtemplate<int (*cmp)(const mydata_t &, const mycmp_t &), typename mycmp_t>mycmp_t

4

1 に答える 1

1

通常、慣用的な C++ では別の方法でコールバックを渡します。特定の型または引数にバインドされず、通常のパラメーターとして:

template<class K, class F>
void insert(T const& v, K const& k, F f);

ただし、実際の質問に答えるには、いいえ、それはできません。

于 2012-07-14T03:40:14.357 に答える