模板函数嵌套多个模板函数

时间:2022-09-08 11:45:53
template <typename T1>
void  Big(T1& infos)
{
    if(1 == a)
            lit1(infos);
    else
          lit2(infos);
}

template <typename T1>
void  lit1(T1& infos)
{
..........
}

template <typename T1>
void  lit2(T1& infos)
{
............
}

Base模板函数调用了两个模板函数,lit1,lit2,infos为不同结构的容器。
这样编译不通过,传入Base的只能是一种容器,但是要在if else 都要编译通过,除非两个容器方法一致。

请问:如何解决?

谢谢!

14 个解决方案

#1


直接说你到底要干什么吧。

#2


引用 1 楼 ri_aje 的回复:
直接说你到底要干什么吧。

两个类,类中有函数,两个vector保存,
class A1
{
    funA1();
};
typedef  vector<A1> A1Vec;

class A2
{
    funA2();
};
typedef vector<A2> A2Vec;

class A3
{
    funA3()
  { 
      A2Vec  A2;
      Big(A2) ;
   }
}
结合上面说的,lit1为A1的实现,lit2为A2的实现。
在funA3中,调用Big函数,其中的if  else都会走,导致编译不过。

#3


你还是把代码全部贴出来吧,if和else都要走,是什么意思?

#4


引用 3 楼 jwj070524 的回复:
你还是把代码全部贴出来吧,if和else都要走,是什么意思?

不好意思啊,代码不好贴。if else都做的意思是说,编译的时候都要进行语法检查。

//class A,template fun
class A
{
public:
    template <typename T1>
        void  Big(T1& infos)// 1
        {
            if(1)
                lit1(infos);    //2
            else    
                lit2(infos);      //3
        }

    template <typename T1>
        void  lit1(T1& infos)
        {
            infos.begin()->fun1(); //2
        }

    template <typename T1>
        void  lit2(T1& infos)
        {
            infos.begin()->fun2(); //3
        }
};


// class A1 A2
class A1
{
    void funA1()
    {
    }
};      
typedef  vector<A1> A1Vec;

class A2
{
    void funA2()
    {
    }
};      
typedef vector<A2> A2Vec;



// main class ...
class A3
{
    void funA3(const A2Vec& A2 )
    {         
        Big(A2) ; // 1
    }                                
}; 

funA3函数调用模板函数Big,Big函数下有两个模板函数,分别实现A1和A2类的函数。
这时候,传入的参数如果是A2Vec A2 ,则 标号2处编译不过。

如果解决此种编译错误?

谢了!

#5


这个需求就挺蛋疼的,不行的话你在Big函数中给两个类型参数吧,一个A1Vec,一个A2Vec。

#6


引用 5 楼 ADF1230 的回复:
这个需求就挺蛋疼的,不行的话你在Big函数中给两个类型参数吧,一个A1Vec,一个A2Vec。


不建议啊,不符合面向对象思想,而且A1 A2方法很多的话,就更不好了。

利用宏怎么样? 通过宏,将lit1 lit2函数传下去 。

#7


你这是八股编程法么。

#8


你把A1和A2里面的funcA1和funcA2改成一个统一的函数名字不行么?

#9


只要测试lit2,和lit1 两个函数就行了

至于那两条路径,看你测试的条件有没有问题
如果没问题,因该可以的,有问题,自然通不过了

其实对于模板,fun1 和 fun2 调用方法相同的话 ,两个函数同名就可以解决问题
不需要if else 了

#10


引用 7 楼 ADF1230 的回复:
你这是八股编程法么。

不清楚八股编程啊。。

#11


引用 8 楼 jwj070524 的回复:
你把A1和A2里面的funcA1和funcA2改成一个统一的函数名字不行么?



引用 9 楼 lm_whales 的回复:
只要测试lit2,和lit1 两个函数就行了

至于那两条路径,看你测试的条件有没有问题
如果没问题,因该可以的,有问题,自然通不过了

其实对于模板,fun1 和 fun2 调用方法相同的话 ,两个函数同名就可以解决问题
不需要if else 了


这两个函数有不同的传参,里面的实现不一样。

#12


编译期区分分支,可以用模板类型做参数区分,比如TypeToInt<T>,然后特化true和false

#13



abstract class BaseA{
     abstract void func();
}

class A1::BaseA
{
    void func()
    {
    }
};      
typedef  vector<A1> A1Vec;
 
class A2::BaseA
{
    void func()
    {
    }
};      
typedef vector<A2> A2Vec;


class A
{
public:
    template <typename T1>
        void  Big(T1& infos)
        {
    这里不懂你什么意思,有什么依赖只能这样!
            infos.begin()->func();
        }
};

#14



template<typename T,  typename F>
Big(std::vector<T>& infos, F f)
{
   std::for_each(info.begin(), info.end(), f);
}

std::vector<A> va;
Big(va, [](A& a){ a.funA1();});
std::vector<B> vb;
...
Big(vb, [](B& b){ b.funB1();});

#1


直接说你到底要干什么吧。

#2


引用 1 楼 ri_aje 的回复:
直接说你到底要干什么吧。

两个类,类中有函数,两个vector保存,
class A1
{
    funA1();
};
typedef  vector<A1> A1Vec;

class A2
{
    funA2();
};
typedef vector<A2> A2Vec;

class A3
{
    funA3()
  { 
      A2Vec  A2;
      Big(A2) ;
   }
}
结合上面说的,lit1为A1的实现,lit2为A2的实现。
在funA3中,调用Big函数,其中的if  else都会走,导致编译不过。

#3


你还是把代码全部贴出来吧,if和else都要走,是什么意思?

#4


引用 3 楼 jwj070524 的回复:
你还是把代码全部贴出来吧,if和else都要走,是什么意思?

不好意思啊,代码不好贴。if else都做的意思是说,编译的时候都要进行语法检查。

//class A,template fun
class A
{
public:
    template <typename T1>
        void  Big(T1& infos)// 1
        {
            if(1)
                lit1(infos);    //2
            else    
                lit2(infos);      //3
        }

    template <typename T1>
        void  lit1(T1& infos)
        {
            infos.begin()->fun1(); //2
        }

    template <typename T1>
        void  lit2(T1& infos)
        {
            infos.begin()->fun2(); //3
        }
};


// class A1 A2
class A1
{
    void funA1()
    {
    }
};      
typedef  vector<A1> A1Vec;

class A2
{
    void funA2()
    {
    }
};      
typedef vector<A2> A2Vec;



// main class ...
class A3
{
    void funA3(const A2Vec& A2 )
    {         
        Big(A2) ; // 1
    }                                
}; 

funA3函数调用模板函数Big,Big函数下有两个模板函数,分别实现A1和A2类的函数。
这时候,传入的参数如果是A2Vec A2 ,则 标号2处编译不过。

如果解决此种编译错误?

谢了!

#5


这个需求就挺蛋疼的,不行的话你在Big函数中给两个类型参数吧,一个A1Vec,一个A2Vec。

#6


引用 5 楼 ADF1230 的回复:
这个需求就挺蛋疼的,不行的话你在Big函数中给两个类型参数吧,一个A1Vec,一个A2Vec。


不建议啊,不符合面向对象思想,而且A1 A2方法很多的话,就更不好了。

利用宏怎么样? 通过宏,将lit1 lit2函数传下去 。

#7


你这是八股编程法么。

#8


你把A1和A2里面的funcA1和funcA2改成一个统一的函数名字不行么?

#9


只要测试lit2,和lit1 两个函数就行了

至于那两条路径,看你测试的条件有没有问题
如果没问题,因该可以的,有问题,自然通不过了

其实对于模板,fun1 和 fun2 调用方法相同的话 ,两个函数同名就可以解决问题
不需要if else 了

#10


引用 7 楼 ADF1230 的回复:
你这是八股编程法么。

不清楚八股编程啊。。

#11


引用 8 楼 jwj070524 的回复:
你把A1和A2里面的funcA1和funcA2改成一个统一的函数名字不行么?



引用 9 楼 lm_whales 的回复:
只要测试lit2,和lit1 两个函数就行了

至于那两条路径,看你测试的条件有没有问题
如果没问题,因该可以的,有问题,自然通不过了

其实对于模板,fun1 和 fun2 调用方法相同的话 ,两个函数同名就可以解决问题
不需要if else 了


这两个函数有不同的传参,里面的实现不一样。

#12


编译期区分分支,可以用模板类型做参数区分,比如TypeToInt<T>,然后特化true和false

#13



abstract class BaseA{
     abstract void func();
}

class A1::BaseA
{
    void func()
    {
    }
};      
typedef  vector<A1> A1Vec;
 
class A2::BaseA
{
    void func()
    {
    }
};      
typedef vector<A2> A2Vec;


class A
{
public:
    template <typename T1>
        void  Big(T1& infos)
        {
    这里不懂你什么意思,有什么依赖只能这样!
            infos.begin()->func();
        }
};

#14



template<typename T,  typename F>
Big(std::vector<T>& infos, F f)
{
   std::for_each(info.begin(), info.end(), f);
}

std::vector<A> va;
Big(va, [](A& a){ a.funA1();});
std::vector<B> vb;
...
Big(vb, [](B& b){ b.funB1();});