首页 > 解决方案 > 调用和重载模板函数

问题描述

假设我在下面显示的类中有 2 个重载方法请忽略这种奇怪的方法重载的需要,这是我最近遇到的

    class A{
      public:

        //Lets call this method 1
        int GetVal(bool isCondition) const
        {
             //do something and return val
        }

        //Lets call this method 2
        template<typename T>
        int GetVal(T expression)
        {
            //do something using expression
            //and return val
        }

    };

int main()
{
    A obj;
    int val = obj.GetVal(false) << std::endl; //I want to invoke method 1
}

main()函数中,我想调用 method1 而不是 method2。我怎样才能做到这一点?谢谢阅读

标签: c++templatesoverloading

解决方案


在 main() 函数中,我想调用 method1 而不是 method2。我怎样才能做到这一点?谢谢阅读

这正是您所要求的

obj.GetVal(false)

因为false是 abool所以它与非模板方法完全匹配。并且当调用与模板方法和非模板方法匹配时,首选非模板方法(在完全匹配的情况下)。

bool真正的问题是:如何使用非模板方法(方法1)的类型()调用方法2?

答案(一个可能的答案)是:添加一个template调用它

obj.template GetVal(false)

以下是一个完整的工作示例

#include <iostream>

struct A
 {
   //Lets call this method 1
   int GetVal (bool)
    { return 1; }

   //Lets call this method 2
   template <typename T>
   int GetVal (T)
    { return 2; }
 };

int main ()
 {
   A obj;

   std::cout << obj.GetVal(false) << std::endl;           // print 1
   std::cout << obj.template GetVal(false) << std::endl;  // print 2
 }

- 编辑 -

鉴于 OP 精确地认为方法 1 是const(而方法 2 不是),方法 2 成为更好的匹配。

这个问题可以通过修改AJarod42 的答案(添加一个调用 const 方法的非 const 非模板方法或 SFINAE 在Tis时禁用模板方法 2 bool)或 Wanderer 的答案(const也制作方法 2)来解决。

但是如果你不想(或者你不能)修改类A,你可以static_assert()直接在main()

std::cout << static_cast<A const &>(obj).GetVal(false) << std::endl;

推荐阅读