如何根据模板参数从不同的命名空间中选择相似的函数

时间:2015-05-08 14:44:19

标签: c++

标题和代码不言自明,

这样的事情可能吗?怎么样?

鼓励吗?如果没有,有什么替代方案? 感谢

#include <iostream>
using namespace std;
namespace A
{
 void foo()
 {
   cout << "In A\n";
 }
}

namespace B
{
 void foo()
 {
  cout << "In B\n";
 }
}


template <typename X>
struct Foo {
    void foo()
    {
     X::foo();
    }
};


int main()
{

  Foo<A> _foo;
  _foo.foo();
 return 0;
}

3 个答案:

答案 0 :(得分:5)

您不能将名称空间用作模板类型(名称空间不是类型);你的代码没有编译。您可以期望的最好的方法是使用Argument Dependent Lookup (ADL),但它不适用于不带参数的函数。

答案 1 :(得分:3)

如果重命名成员函数,可以使用代理标记通过ADL找到它:

namespace A
{
    struct tag {};
     void foo(tag)
     {
         std::cout << "In A\n";
     }
}

namespace B
{
    struct tag {};
     void foo(tag)
     {
         std::cout << "In B\n";
     }
}

template<class Tag>
struct Foo {
    void fooADL()
    {
        foo(Tag{});
    }
};

int main()
{
    Foo<A::tag> f;
    f.fooADL();
}

答案 2 :(得分:2)

  

这样的事情可能吗?

不,你不能参数化命名空间。

  

如果没有,有什么替代方案?

使用类而不是名称空间为函数提供可参数化的范围:

struct A {
    static void foo();
};

struct B {
    static void foo();
}