仅当一个参数中未使用 std::function 时,模板函数替换才有效
Template function substitution works only if one isn't using std::function in one parameter
我有一个带有两个模板参数的模板函数。
第一个(T
(是根据第一个参数的类型推导到函数的。第二个(ItrT
(是通过使用std::type_traits
和T
推导出来的。
ItrT
作为参数的类型(参见函数bar
(时,所有类型都是隐式推导的,但是当我使用std::function<void(ItrT)>
作为参数的类型(参见函数foo
(时,只有在完全指定所有模板参数时才能推断出正确的类型(即使使用与函数定义中完全相同的代码(。可以想象,在模板中使用ItrT
不会改变编译器推断模板的能力。
为什么不是这样呢?我需要做什么,以便可以隐式推导所有模板参数?
我正在使用C++17。
template <class T, class ItrT = typename std::iterator_traits<T>::value_type>
auto foo(T iterator, std::function<void(ItrT)> expr) -> void{
}
template <class T, class ItrT = typename std::iterator_traits<T>::value_type>
auto bar(T iterator, ItrT expr) -> void{
}
int main() {
std::vector<int> vec = {1, 2, 3};
bar(vec.begin(), 1); // Compiles!
foo(vec.begin(), [](int) {}); // Failes!
foo<decltype(vec.begin()),
std::iterator_traits<decltype(vec.begin())>::value_type>
(vec.begin(), [](int) {}); // Compiles!
}
我猜这里的混淆是围绕默认模板参数的作用。
规则不是:尝试推断一个参数。如果扣除失败,则使用默认值(如果提供(。
相反,规则是:如果参数在推导的上下文中,则推导它。如果扣除失败,则中止。如果它不在推导上下文中,并且未显式提供,请使用默认参数。换句话说,仅当参数既不在推导上下文中,也不显式提供时,才使用默认参数。
在您的两个示例中,ItrT
都在推导的上下文中,因此根本不考虑默认模板参数。两者之间的区别在于,您可以从lambda推断T
(您只是匹配其类型(,但不能从lambda推断function<void(T)
- lambda可以转换为适当的function
,但lambda不是function
。模板扣除不会进行转化。模板演绎只是匹配模式。
相关文章:
- "error: no matching function for call to"构造函数错误
- 库函数需要一个 std::function<void(void)>,如何传入类函数?
- 将函数包装器转换为 std::function
- 类型擦除的std::function与虚拟函数调用的开销
- 如何为 v8::P ersistent<v8::Function> 创建到 c++ 函数的包装器
- C++复制函数重载导致"must be a nonstatic member function"错误
- C++派生类重载函数(带有 std::function 参数)不可见
- 如何将函数指针从 std::function 传递到 Linux 克隆?
- 如何在跳过所有内部实现的同时跳转到 GDB 中 std::function 中的函数?
- 将函数的参数 - 签名从使用 'std::function<T>' 转换为模板参数类型
- C++:从重载函数转换为 std::function
- 仅当一个参数中未使用 std::function 时,模板函数替换才有效
- 使用 object 中的方法调用带有 std::bind 和 std::function.target 的 C 样式函数
- 插件:TypeError:addons.function() 不是一个函数
- 可变参数函数模板不能很好地使用 std::function 作为参数
- 将另一个类的成员函数传递到 std::function 参数中
- 如何从类成员函数返回指针,例如 size_t * class :: function(); 并使用类析构函数 ~size
- 创建函数变体向量时"No matching function for call"错误
- "attempting to reference a deleted function"函数参数
- std::function -> 函数指针