有没有办法检查是否已在命名空间中定义函数(名称和签名)

时间:2015-07-22 02:45:16

标签: c++11

我想在模板方法中调用名称空间定义函数,并希望使用std :: enable_if仅在目标名称空间定义函数存在时才生成该方法。有可能吗?

我应该补充一点,调用方法接受一个在命名空间中定义其类型的参数。这就是我想要检查的命名空间。

namespace SomeNamespace
{
    ...
    void SomeFunc(...);

    class SomeType { ... };
}

template <class T>
void MyClass::MyMethod(const SomeNamespace::SomeType& obj)
{
   ...
   SomeNamespace::SomeFunc(...);
   ...
}

1 个答案:

答案 0 :(得分:1)

不确定是否可以使用std::enable_if执行此操作,但实现它的一种方法如下(假设func采用单个参数,应该很容易推广到多个参数) :

#include <iostream>

namespace NS {
   void func(int x)
   {
      std::cout << "func called with arg " << x << std::endl;
   }


   void call_func(...)
   {
      std::cout << "func does not exist" << std::endl;
   }

   template<typename T>
   auto call_func(T t) -> decltype( func(t), void())
   {
      std::cout << "func exists, calling it" << std::endl;
      func(t);
   }
} 

int main()
{
    call_func(2);
    return 0;
}

这将产生输出

func exists, calling it
func called with arg 2

但如果你注释掉func的定义,你会得到:

func does not exist

有点笨重,因为call_func重载需要在与func相同的命名空间内定义,否则它不起作用。为了使其更具可重用性,您可以使用call_funcNS args将func定义包含在某个宏中。