我的目标是c ++ 11(使用g ++版本4.7)和c ++ 0x(使用icpc 12.something,即intel 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
已经命名了第二个参数的类型。所以在我看来,我想有一些方法可以让编译器推断出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
可以将第二个参数的类型默认为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
尚未定义(等等)。
答案 0 :(得分:1)
通常,您在惯用语C ++中以另一种方式传递回调:未绑定到特定类型或参数以及作为普通参数:
template<class K, class F>
void insert(T const& v, K const& k, F f);
要回答你的实际问题,不,你不能这样做。