私は 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
または の型から推測されていますkey
。mycmp_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