当前位置: 首页 > 知识库问答 >
问题:

是否为模板参数扣减使用一个参数?

曹浩波
2023-03-14
template <typename T> void assign(T *a, T b) { *a = b; }

int main() {
    double i;
    assign(&i, 2);
}

在这种情况下,我总是希望t从第一个参数中推导出来,但看起来我没有很好地表达这一点。2的类型是int,因此:

deduce.cpp:5:5: error: no matching function for call to 'assign'
    assign(&i, 2);
    ^~~~~~
deduce.cpp:1:28: note: candidate template ignored: deduced conflicting types for parameter 'T' ('double' vs. 'int')
template  void assign(T *a, T b) { *a = b; }

有没有一种方法可以声明assign(),这样第二个参数就不参与模板参数的推导了?

共有1个答案

轩辕成天
2023-03-14

使用两个类型参数可能是最好的选择,但是如果您真的想只从第一个参数执行推论,那么只需使第二个参数不可推论:

template<typename T>
void assign( T* a, typename std::identity<T>::type b );
  • 演示:http://ideone.com/zw6mpu

这个答案的早期版本建议使用C++11中引入的模板别名特性。但是模板别名仍然是一个可推断的上下文。std::identitystd::remove_reference阻止演绎的主要原因是模板类可以专门化,因此即使您有模板类型参数的typedef,另一个专门化也可能有相同类型的typedef。由于可能存在歧义,演绎不会发生。但是模板别名排除了专门化,因此仍然会发生演绎。

 类似资料:
  • 考虑以下代码: 我显式指定类型是因为(https://stackoverflow.com/a/40476083): 当参数包没有最后出现在参数声明中时,它是一个非推断上下文。非推断上下文意味着必须显式给出模板参数。 MSVC成功编译,而gcc和clang都拒绝代码: 现在让我们做一个小小的改变-我们从本地中删除,从而使模板参数包变为空: 这一次,三个编译器都认为代码不正确。使用http://rex

  • 在模板成员函数中使用std::function时出现编译错误,下面的代码是一个简单的示例: 我用的是C++11和G++4.7

  • 我有以下问题:一个类模板a,有几个模板参数,我想构建一个类B,它以a为模板参数,并提取a的第一个模板参数,以便在某种方法中使用它(想想从std::vector 中提取int并返回默认的int{})。 我知道这种天真的方法不会编译,但我不知道如何实现这样的东西。感谢任何提示。

  • 我有一个函数,它使用Boost进行base64编码。它有两个模板参数:一个用于输入的容器类型,另一个用于输出的容器类型。这允许您使用提供二进制数据,但可以返回。 这是代码: 用法示例: 这里有活样品 请注意,在上面的示例中,我仍然必须为输出容器提供模板参数,即使它与输入容器的类型相同。在这些场景中,我希望模板参数是可选的,而是使用由推导的类型。我不确定我可以执行什么变通或调整来获得这种界面,但很高

  • 已编辑(原始问题只有int A,int B): 模板参数推断在两个专门化之间比较的#参数相同时按预期工作,但在它们不同时失败(因为在其中一个专门化中包含默认参数)。 例如:为什么模板参数推导在一种情况下与另一种情况下失败,有人能指出解释这一点的任何资源/标准吗? 错误:模糊模板实例化'类Foo

  • 在里面https://github.com/stlab/libraries/blob/main/stlab/concurrency/main_executor.hpp,我读到 decltype(f)的意义是什么,为什么不直接使用f?