繁体   English   中英

C ++在类模板中使用函数模板

[英]C++ using function template in class template

template <int C> class MyClass;

...     


template <int C>
double trans(MyClass<C> &a)
{
    //return some double 
}

//this is supposed to be function template
template <int C>
double func(MyClass<2> &a)
{
    //return some double
}

template <int C>
MyClass<C-1> func(MyClass<C> &a)
{
    MyClass<C-1> ret;
    return ret;
}

template <int C>
double otherFunc(MyClass<C> &a)
{
     double result;
     if(C == SOME_CONSTANT)
         result = func(a);
     else
         result = trans(func(a));

}

我的问题是我想检查参数otherFunc调用函数模板func (返回双otherFunc )而不是类模板func的成员函数(返回MyClass)中的模板参数C。 但是以某种方式,编译器尝试对返回MyClass的func进行func

     if(C == SOME_CONSTANT)
         result = func(a);

这部分使我得到了编译器错误(因为double = MyClass不可行)。 我应该如何解决这个问题?

我想原因是:

 if(C == SOME_CONSTANT)
     result = func(a);
 else
     result = trans(func(a));

在运行时进行检查,而模板特化和类型检查则在编译期间进行。 这两个功能:

 template <int C>
 double func(MyClass<2> &a)
 {
     //return some double
 }

 template <int C>
 MyClass<C-1> func(MyClass<C> &a)
 {
     MyClass<C-1> ret;
     return ret;
 }

具有几乎相同的签名-唯一的区别是,对于C==2 ,使用一个返回double签名,否则使用一个返回MyClass<2>签名。 因此,您得到的是:

 // for C==2
 if(C == SOME_CONSTANT)
     result = func<2>(a); // returns double - just like you wanted
 else
     result = trans<2>(func<2>(a)); // pass double into trans<?>(MyClass<?>), so the parameter cannot be resolved unless you specified some implicit constructor/explicit conversion operator 

 // for e.g. C==3
 if(C == SOME_CONSTANT)
     result = func<3>(a); // returns MyClass<2> while result is double
 else
     result = trans<2>(func<3>(a)); // pass MyClass<2> into trans<?>(MyClass<>) - like you wanted

因此,基本上,您的代码在第一种或第二种情况下的专业化类型均无效。 您可以改为执行以下操作:

 template <>
 MyClass<2> func<2>(MyClass<2> &a)
 {
     return a;
 }

 template <int C>
 MyClass<C-1> func(MyClass<C> &a)
 {
     return MyClass<C-1>;
 }

保持模板类型一致,然后:

if(C == SOME_CONSTANT)
   result = trans(a);
else
   result = trans(func(a));

这只是如何处理它的一个示例。 如果您避免弄乱针对不同模板专业化键入的不同返回值,事情应该会更容易。

很难在评论中详细说明,因此我将发布答案。 回顾一下我在评论中所说的话:

  • 您不能在otherFunc中使用if / else来为特定的MyClass实例进行编译是不合法的,
  • 可以使用相同的模板专业化方法来创建替代的otherFunc定义来处理MyClass<2>

样例代码:

#include <iostream>

template <int C>
class MyClass
{ };

template <int C>
double trans(const MyClass<C> &a)
{
    return C + 700;
}

template <int C>
MyClass<C-1> func(MyClass<C> &a)
{
    MyClass<C-1> ret;
    return ret;
}


double func(MyClass<2>& a)
{
    return 200.0;
}

template <int C>
double otherFunc(MyClass<C> &a)
{
     return trans(func<C>(a));
}

template <>
double otherFunc<2>(MyClass<2>& a)
{
    return func(a);
}


int main()
{
    MyClass<2> a;
    std::cout << otherFunc(a) << '\n';

    MyClass<4> b;
    std::cout << otherFunc(b) << '\n';
}

输出:

200
703

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM