代码之家  ›  专栏  ›  技术社区  ›  tjwrona1992

通过模板函数对未知类型调用方法

  •  0
  • tjwrona1992  · 技术社区  · 6 年前

    C++语言允许我编写一个模板函数,它将调用传递给函数的对象的方法。

    这里的问题是,当我这样做时,我的IDE(NetBeans 8.2)会抱怨它不能解决这个方法。这是有意义的,因为在我试图编译代码之前,将用于“T”的类型是未知的,但它给我一个警告,这让我有点担心这样做是否是一种糟糕的编程实践。

    请考虑以下代码:

    struct S1 {
        void method() const {
            cout << "Method called from S1!" << endl;
        }
    };
    
    struct S2 {
        void method() const {
            cout << "Method called from S2!" << endl;
        }
    };
    
    template <typename T>
    void call_method(const T& object) {
    
        // IDE reports a warning "can't resolve the template based identifier method."
        object.method();
    }
    

    用法示例:

    S1 obj1;
    S2 obj2;
    
    call_method(obj1);
    call_method(obj2);
    

    这段代码可以编译并正常工作,但是IDE总是会抱怨。这样可以吗?或者有更好的设计,我应该知道,以获得同样的预期结果。

    期望的结果是编写一个函数,该函数可以使用S1或S2对象,而无需关心它是哪个对象,只要它们提供一个包含“method()”的接口。

    假设我无法访问S1和S2的源代码,因此无法对它们进行更改。(例如,我不能让它们从公共基类继承并使用动态多态性而不是模板函数来实现相同的效果)。

    1 回复  |  直到 6 年前
        1
  •  5
  •   super    6 年前

    这完全可以,在很多情况下都会用到。例如,处理标准库中的通用容器或不同类型的迭代器。

    如果传入的类型没有适当的方法,则会出现编译错误。

    如果需要,可以使用SFINAE来确保传入的类型是您期望的类型之一。有时可以是好的或有用的,但通常不需要。

    更新: static_assert 是@Evgeny指出的对模板施加约束的另一种有用方法