make`foo(derived_object,x)`call`foo(Base const&,X)`而不是模板函数?

时间:2016-03-26 06:32:38

标签: c++ overload-resolution

注意:这是 question-with-answer ,以便记录其他人可能认为有用的技术,以便了解其他人更好的解决方案。请随意添加批评或问题作为评论。也可以随意添加其他答案。 :)

1 问题:如何定义函数foobar的“捕获所有”通用实现(以及其他此类函数) (优选地通过一般机制),例如,以下代码有效:

struct Base {};
auto foo( Base const& ) -> int { return 101;}
auto bar( Base const&, int x ) -> int { return x + 2; }

struct Derived: Base {};

struct Other
{
    auto foomethod() -> int { return 201; }
    auto barmethod( int const x ) -> int { return x + 2; }
};

#include <iostream>
using namespace std;
auto main() -> int
{
    Derived d;
    int const r1 = foo( d );            // Invokes the Base arg overload.
    int const r2 = bar( d, 100 );       // Invokes the Base arg overload.
    cout << r1 << " " << r2 << endl;

    Other o;
    int const r3 = foo( o );            // Invokes the general implementation.
    int const r4 = bar( o, 200 );       // Invokes the general implementation.
    cout << r3 << " " << r4 << endl;
}

这是关于通过库提供foobar和类似功能。解决方案应该适用于用户为其提供重载的任意用户定义的类。

1 这个问题+答案是对主持人无限期锁定的earlier question的答案,即它已经是重复的,除了之前没有发布完全满意的答案锁定。如果下面的答案可以在那里发布,我会接受它作为解决方案,除非提供更好的答案,因为它确实回答了问题。这不是at Meta所讨论的所谓答案,例如无法在x处理bar这样的论点,但它基于basic idea put forth by Johannes Schaub。 功能

0 个答案:

没有答案