我想在模板方法中调用名称空间定义函数,并希望使用std :: enable_if仅在目标名称空间定义函数存在时才生成该方法。有可能吗?
我应该补充一点,调用方法接受一个在命名空间中定义其类型的参数。这就是我想要检查的命名空间。
namespace SomeNamespace
{
...
void SomeFunc(...);
class SomeType { ... };
}
template <class T>
void MyClass::MyMethod(const SomeNamespace::SomeType& obj)
{
...
SomeNamespace::SomeFunc(...);
...
}
答案 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_func
和NS
args将func
定义包含在某个宏中。