【问题标题】:How to use a template parameter in another template parameter declared before如何在之前声明的另一个模板参数中使用模板参数
【发布时间】:2009-09-18 22:48:11
【问题描述】:

一个模板参数可以用在另一个模板参数中:

template<typename T, T N>
struct s
{
};

但是如果在“N”之后声明,是否可以引用“T”?

这不起作用:

template<T N, typename T>
struct s
{
};

我们可以通过预先声明“T”或做其他事情来帮助编译器吗?

提前致谢。

编辑:正如前两个回复所问的“你为什么愿意这样做?”我将解释目标:

我想让编译器推断类型“T”以便更轻松地使用模板类。

例如:

template<typename T, T A, T B>
struct sum
{
    static T const value = A + B;
};

这个模板可以这样使用:

sum<int, 1, 2>::value

但如果能这样使用就更好了:

sum<1, 2>::value

从技术上讲这应该是可能的,因为编译器知道“1”和“2”的类型:“int”,实际上它使用这些信息来找到函数的最佳重载。 所以通过这种方式声明模板:

template<T A, T B, typename T>
struct sum
{
    static T const value = A + B;
};

编译器可以利用它的能力从第一个和第二个提供的信息中推断出最后一个参数,然后找到最好的模板来实例化。

【问题讨论】:

    标签: c++ templates parameters declaration


    【解决方案1】:

    就像其他人说的 - 不,这是不可能的,编译器无法从非类型 template 参数推断T 的类型(在函数的情况下,它推断类型来自 函数 参数):

    14.8.2.4/12:

    不能从非类型模板参数的类型推导出模板类型参数。

    在任何情况下,无论如何都不会对类模板的参数进行扣除。函数模板的示例可能是

    template<int> struct having_int { };
    template<typename T, T i> void f(having_int<i>);
    int main() { having_int<0> h; f(h); }
    

    在这种情况下,T 不会被推断为int - 您必须明确指定它。

    【讨论】:

    • 感谢您的回答:如果规范说不,那就是不。现在的问题是:为什么这种有限的行为,而似乎可以进行这种扣除?你有一些例子证明这个决定是合理的吗?谢谢。
    • 因为模板元编程从来就不是为了表达? :) 有趣的问题,虽然。也许您应该检查是否已提出此建议,或者为 C++1x 提出该建议。
    【解决方案2】:

    你不能。我不明白你为什么也这样做。

    【讨论】:

      【解决方案3】:

      下面是垃圾,因为我没有正确阅读您的问题。

      确实,我也看不出你想要达到的目标有什么意义。

      #include <iostream>
      
      template<typename T, T N>
      struct s
      {
          T size() { return N; }
      };
      
      
      int main()
      {
          s<int, 4> x;
          std::cout << x.size()<< '\n';
      
          //s<float, 3.14> f; //this doesn't compile
      }
      

      这是使用 GCC 和 Comeau Online 为我编译的。

      我认为问题在于您尝试使用的 T 类型。非类型模板参数仅支持整数类型,然后是指向具有外部链接的对象的指针(或类似的东西,也许还有一些其他非常有限的东西)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-31
        • 2022-01-19
        • 2017-04-03
        • 1970-01-01
        相关资源
        最近更新 更多