首页 > 解决方案 > 为什么模板参数推导失败?

问题描述

最小化的例子:

template <typename T, int N>
struct Deducer {
    Deducer(int) {}
};

template <typename T, int N = 1>
void foo(Deducer<T, N> d){}

int main() {
    foo<char>(345);
}

螺栓示例

产量错误

candidate template ignored: could not match 'Deducer<char, N>' against 'int'

为什么编译器会忽略隐式强制转换?

如果这里有任何简单的解决方法?

我可以考虑两种选择:

(1)指定所有模板参数(不是我的选项,真实案例有很多,我要推导) (2)这样写中间函数:

template <typename T, int N = 1>
void foo_step(int d){ foo<T, N>(d); }

也不是一个选择,我有大量的论据。

有任何想法吗?

标签: c++

解决方案


N可以推导出来

template <typename T, int N = 1> void foo(Deducer<T, N> d)

所以默认值= 1大多没用。

如果您想强制调用该方法,例如:

foo<char>(345);
foo<char, 42>(345);

你可能会这样做:

// in C++20, std::type_identity might be used instead:
template <typename T> struct non_deducible { using type = T; };
template <typename T> using non_deducible_t = typename non_deducible<T>::type;

template <typename T, int N = 1> void foo(non_deducible_t<Deducer<T, N>> d);

但是你不能再这样做了:

foo(Deducer<char, 42>());

推荐阅读