在重载的 operator 上指定模板参数

分享于2023年06月29日 c++ operator-overloading template-argument-deduction 问答
【问题标题】:Specifying template parameters on overloaded operator()在重载的 operator() 上指定模板参数
【发布时间】:2023-06-28 22:12:01
【问题描述】:
struct foo{
    template
    auto operator()(T arg) { return T{}; }
}

要使用 operator() ,我将其称为: foo()(1) T 将被推导出为 int

但是,如果我想将 T 指定为其他内容,例如 long ,似乎唯一可行的方法是,这会破坏使用 operator() 的原因:

foo().operator()(1);

还有更好的选择吗?


我正在考虑让 foo 采用模板参数 U 并将 U 默认为 void ;如果 U 不是 void T 将默认为 U 。但是,我宁愿只更改 operator() 函数。也许改用 lambda?

  • foo()(long{1})
  • 如果你打算使用 {} 来初始化 long ,你也可以使用它来初始化 foo ,同样: foo{}(long{1}); 但是,它会更容易使用@ 987654344@ 或 1l 而不是声明 1 long ,而不是显式指定 long 类型: foo{}(1L);
  • 所以我不让我删除它,所以我会编辑它。 问一个新的。没有理由使您已经收到的答案无效。
  • @NathanOliver 你是对的,会问一个新的。

【解决方案1】:

您可以使用 L or l suffix 指定整数文字 1 应被视为 long 而不是 int ,例如:

foo()(1L)

【讨论】: