c++ - 为什么模板参数推导失败?
问题描述
最小化的例子:
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); }
也不是一个选择,我有大量的论据。
有任何想法吗?
解决方案
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>());
推荐阅读
- javascript - 创建一个可以在其他 JS 文件中使用的音频流全局变量
- java - ISO 8601 日期格式字符串到 Java 中的 Date 对象
- vba - 如何更改 Outlook VBA 中电子邮件的接收时间?它说它是写保护的
- javascript - 如何使用 Leaflet 从地图中删除标记?
- java - ObjectInputStream#readObject 使用外部 Jar 类引发 ClassNotFoundException
- python - 将结构化数据附加到 Python 中的类属性
- java - java.util.LinkedHashMap$LinkedKeyIterator LinkedHashSet 中的无限循环
- java - Thread Run() 后实例变量为空 - Java 中的扑克骰子程序
- python - 带有模板渲染的 Django 错误。未找到“登录”的反向。“登录”不是有效的视图函数或模式名称
- php - HTML 表未显示 PostgreSQL 的第一条记录