3

假设我在命名空间 A 中有一个模板函数。我还有另一个命名空间 B。在命名空间 A 中声明了一个模板函数,定义为

template<typename T, typename U>
void f(T a, U b);

现在在命名空间 B 中,我想声明一个专门的模板函数类型。我在想我是否可以typedef使用模板函数,所以它在命名空间 B 中声明为

void f(int a, double b);

没有实际实现调用模板函数的函数。由于有一种方法可以用特定的模板参数声明新的类型名,难道不应该有一种方法可以用函数来做到这一点吗?我尝试了不同的方法来实现它,但效果并不理想。

那么在 C++ 中是否已经有一种方法可以使用给定的模板参数重新声明函数而不实际实现新函数?如果不是,它是否可以在 C++11 中以某种方式实现?

这将是一个很好的功能,因为它会使函数的目的更清晰,并且在语法上会更好:)

编辑:所以可以写:

using A::f<int, double>;

在 B 命名空间中,函数将显示这些模板参数

4

2 回答 2

5

您可以使用using

namespace A {
    template <typename T> void f(T);
    template <> void f<int>(int);    // specialization
}

namespace B {
    using ::A::f;
}

您无法区分这样的专业化(因为using只是关于names),但它应该足以使所需的专业化可见。

于 2012-04-09T18:56:18.967 回答
2

您可以包装内联函数:

namespace A
{
    template<typename T, typename U>
    void f(T a, U b);
};

namespace B
{
    inline void f(int a, double b) { A::f(a,b); }
};

看到这个问题:

C++11:如何给函数起别名?

于 2012-04-09T19:01:25.113 回答