【问题标题】:How to Implicitly Call a Function Call Operator?如何隐式调用函数调用运算符?
【发布时间】:2014-11-11 17:17:24
【问题描述】:

如何隐式调用类对象的模板化函数调用运算符?

class User_Type
{
public:
    template< typename T > T operator()() const;
};

void function()
{
    User_Type user_var;
    int int_var_0 = user_var.operator()< int >(); // explicit function call operator; ugly.
    int int_var_1 = user_var< int >(); // implicit function call operator.
}

g++-4.9 -Wall -Wextra的输出错误是:

    error: expected primary-expression before ‘int’
        auto int_var_1 = user_var< int >();
                                   ^

【问题讨论】:

  • 如果您有“隐式转换”(正如您在评论中提到的),这有什么意义?
  • @DieterLücking 我想要一个符号作为“概念价值”,并且知道如何将自己表示为许多不同的类型。
  • @DieterLücking 想想T val = 0 的声明;这对任何基本类型都有效。我想提供一个对任何基本类型和用户扩展类型都有效的T val = foo。在我的例子中,foo 是类 Foo 的命名空间静态实例。

标签: c++ templates function-call-operator


【解决方案1】:

如果需要显式指定模板参数,则不能。指定它的唯一方法是使用您的第一个语法。

如果模板参数可以从函数参数推导出来,或者有一个默认值,那么如果你想要那个参数,你可以使用简单的函数调用语法。

根据类型的用途,将类而不是成员设为模板可能更有意义,因此您可以在声明对象时指定参数。

【讨论】:

  • 这真是太糟糕了。 sigh 您是否碰巧在标准文档中有关键字或完整的章节和段落参考可以解释这一点?
  • 我的类本身不能带一个模板参数;根据定义,它充当可以转换为T 的对象。
  • @CharlesLWilcox 为什么不使用模板显式转换运算符?编辑:显式调用转换运算符有什么问题?
  • @CharlesLWilcox:我会使用一个名为as 的函数模板或类似的东西。无论如何,user_var.as&lt;int&gt;() 可能比user_var&lt;int&gt;() 更好。
  • @CharlesLWilcox 确实如此。
【解决方案2】:

没有办法。可以用像

这样的非使用参数作弊
class User_Type
{
public:
    template< typename T > T operator()( T * ) const;
};

void function()
{
    User_Type user_var;
    int int_var_1 = user_var((int*)0); // implicit function call operator.
}

但这并不是你想要的。

【讨论】:

  • 是的.. 在我考虑过“按引用填充”之后,我考虑过这一点,但它仍然使使用变得不那么流畅。
猜你喜欢
  • 2011-09-10
  • 2021-09-30
  • 1970-01-01
  • 1970-01-01
  • 2011-06-09
  • 2017-04-04
  • 1970-01-01
  • 1970-01-01
  • 2016-01-05
相关资源
最近更新 更多