【问题标题】:Typedef with template functions带有模板函数的 Typedef
【发布时间】:2012-04-09 18:52:07
【问题描述】:

假设我在命名空间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 命名空间中,函数将显示这些模板参数

【问题讨论】:

  • 看了一眼,这有帮助吗? www2.research.att.com/~bs/C++0xFAQ.html#template-alias
  • 不太确定是否支持,因为当前版本的 Visual c++ 似乎不支持使用语法(?)。至少对我来说,它只是输出了大量的语法错误
  • 编译器也必须支持该功能。我认为 GCC 还没有。

标签: c++ c++11


【解决方案1】:

你可以使用using:

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

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

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

【讨论】:

    【解决方案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: How to alias a function?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-12
      • 1970-01-01
      相关资源
      最近更新 更多