是否可以从较晚的模板参数推断或默认较早的模板参数
Is it possible to infer or default an earlier template parameter from a later one?
我的目标是c++11(使用g ++版本4.7(和c ++ 0x(使用ICPC 12.something,英特尔c ++编译器(。 我可能会有一天使用叮当。
我有以下数据结构:
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
尚未定义(尚未(之类的东西。
通常,您以惯用C++的方式传递回调: 不绑定到特定类型或参数,并作为普通参数:
template<class K, class F>
void insert(T const& v, K const& k, F f);
不过,要回答您的实际问题,不,您不能这样做。
相关文章:
- 使函数参数默认为周围范围
- 如何将值传递给其参数(默认参数)
- 当“std::make_index_sequence”和“std::index_sequence”用于模板参数默认类型时
- C ,构造器中允许的参考参数默认值
- 哪些规则控制参数默认赋值?
- 错误:上一个规范后给出的参数默认参数
- 是否可以设计一个包含模板参数默认值的类
- 构造函数中参数C++默认值
- 如何设置依赖于其他参数的参数默认值
- C++模板参数默认函数实现
- QInput对话框参数默认值
- g++4.8.2上列表方法参数默认初始化时出错
- 在函数定义中指定参数默认值会导致错误 C2143:语法错误:'='之前缺少')'
- 函数模板:将第一个模板参数默认为第二个
- 模板模板参数默认可以引用其他模板类型的参数
- 参数默认为先例参数的值
- 如何修改一个类,使它只有一个成员函数,所有参数默认
- 内置类型的模板参数默认值
- 是否可以使用构造函数或对象作为其他类方法的参数默认值?
- 模板参数默认为更高版本