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

byxbai1989 2014-09-19 03:40:26
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 都要编译通过,除非两个容器方法一致。

请问:如何解决?

谢谢!
...全文
751 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2014-09-25
  • 打赏
  • 举报
回复

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();});

fsy351 2014-09-25
  • 打赏
  • 举报
回复

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();
        }
};

byxbai1989 2014-09-23
  • 打赏
  • 举报
回复
引用 8 楼 jwj070524 的回复:
你把A1和A2里面的funcA1和funcA2改成一个统一的函数名字不行么?
引用 9 楼 lm_whales 的回复:
只要测试lit2,和lit1 两个函数就行了 至于那两条路径,看你测试的条件有没有问题 如果没问题,因该可以的,有问题,自然通不过了 其实对于模板,fun1 和 fun2 调用方法相同的话 ,两个函数同名就可以解决问题 不需要if else 了
这两个函数有不同的传参,里面的实现不一样。
byxbai1989 2014-09-23
  • 打赏
  • 举报
回复
引用 7 楼 ADF1230 的回复:
你这是八股编程法么。
不清楚八股编程啊。。
蜗牛sf 2014-09-23
  • 打赏
  • 举报
回复
编译期区分分支,可以用模板类型做参数区分,比如TypeToInt<T>,然后特化true和false
jwj070524 2014-09-22
  • 打赏
  • 举报
回复
你把A1和A2里面的funcA1和funcA2改成一个统一的函数名字不行么?
神-气 2014-09-22
  • 打赏
  • 举报
回复
你这是八股编程法么。
byxbai1989 2014-09-22
  • 打赏
  • 举报
回复
引用 5 楼 ADF1230 的回复:
这个需求就挺蛋疼的,不行的话你在Big函数中给两个类型参数吧,一个A1Vec,一个A2Vec。
不建议啊,不符合面向对象思想,而且A1 A2方法很多的话,就更不好了。 利用宏怎么样? 通过宏,将lit1 lit2函数传下去 。
lm_whales 2014-09-22
  • 打赏
  • 举报
回复
只要测试lit2,和lit1 两个函数就行了 至于那两条路径,看你测试的条件有没有问题 如果没问题,因该可以的,有问题,自然通不过了 其实对于模板,fun1 和 fun2 调用方法相同的话 ,两个函数同名就可以解决问题 不需要if else 了
jwj070524 2014-09-20
  • 打赏
  • 举报
回复
你还是把代码全部贴出来吧,if和else都要走,是什么意思?
神-气 2014-09-20
  • 打赏
  • 举报
回复
这个需求就挺蛋疼的,不行的话你在Big函数中给两个类型参数吧,一个A1Vec,一个A2Vec。
byxbai1989 2014-09-20
  • 打赏
  • 举报
回复
引用 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都会走,导致编译不过。
byxbai1989 2014-09-20
  • 打赏
  • 举报
回复
引用 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处编译不过。 如果解决此种编译错误? 谢了!
ri_aje 2014-09-20
  • 打赏
  • 举报
回复
直接说你到底要干什么吧。

33,321

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧