是否可以从较晚的模板参数推断或默认较早的模板参数

Is it possible to infer or default an earlier template parameter from a later one?

本文关键字:参数 默认 是否      更新时间:2023-10-16

我的目标是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_fundouble_int_compare_fun已经命名了第二个参数的类型。 所以在我的脑海中,我想有某种方法可以让编译器推断第一个模板参数来insert。 我很想能够说

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

并且mycmp_tcmp的签名或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);

不过,要回答您的实际问题,不,您不能这样做。