只特化一个类模板的某一个成员函数

竞天问 2012-07-01 10:11:19
有类定义如下

template<class T, unsigned B>
class Base
{
//应被特化的函数
void Func(){}
};


现在只想在模板参数B为16时对函数Func进行特化,应该怎么做?

搜了半天也没找到可行的解决方案,希望大家帮帮忙,谢谢
...全文
1911 57 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
57 条回复
切换为时间正序
请发表友善的回复…
发表回复
jamesguo37 2014-06-06
  • 打赏
  • 举报
回复
引用 46 楼 zdarkalone 的回复:
c++版的回字有四种写法么。。。 不得不说每种方法都很有用 17楼 一般类的特化,需要重写整个类比较麻烦 22楼 用了函数对象,特化函数对象避免像17楼里重写整个类,但是失去了类信息 19楼 用了enable_if,但是如果要对多个值进行特化比较麻烦。 实现上有点问题,这样写也许可以

template<class T, unsigned B>
struct Base
{
 template <unsigned N>
 typename ::enable_if<16!=N>::type
 FuncImpl () { std::cout << "primary" << std::endl; }

 template <unsigned N>
 typename ::enable_if<16==N>::type
 FuncImpl () { std::cout << "specialization" << std::endl; }
 void Func() {
     FuncImpl<B>();
 }
};
44楼 用了函数重载,根据不同的B的参数选择不同的重载函数,应该是最灵活的方式了。 这帖子长知识。
HI,有没有更通用的做法。请看帖http://bbs.csdn.net/topics/390804597
cust_hf 2013-12-12
  • 打赏
  • 举报
回复
http://blog.csdn.net/cust_hf/article/details/17287439
翠屏阿姨 2012-07-10
  • 打赏
  • 举报
回复
#if B != 16
fun() {}
#endif
竞天问 2012-07-08
  • 打赏
  • 举报
回复
[Quote=引用 53 楼 的回复:]

用一个基类,楼主试试是不是这样的

#include "stdafx.h"
#include <iostream>

template<unsigned B>
struct BB
{
void Func1 () { std::cout << "f1" << std::endl; }
};

template<>
struct BB<16>
{
void Func……
[/Quote]

目测这个可以达到目的,一般情况下和内部类函数对象差不多,基类不能访问子类的成员。

如果用虚函数还会是运行时绑定。

和继承自自我特化类的那个方法应该差不多
竞天问 2012-07-08
  • 打赏
  • 举报
回复
[Quote=引用 54 楼 的回复:]

引用 33 楼 的回复:

引用 32 楼 的回复:
这个方法应该是正确的哦。
[/Quote]

你用的哪个编译器?
qiangorqiang 2012-07-07
  • 打赏
  • 举报
回复
[Quote=引用 33 楼 的回复:]

引用 32 楼 的回复:
……
template<class T>
void SpecialValue<T,16>::Func()
{
printf("Template Specialization Value:16\n");
}
……

这个看起来舒服,不过是不正确的。因为 c++ 不允许定义偏特化类模板成员,而不定义该偏特化类模板。
[/Quote]

这个方法应该是正确的哦。
leolee82 2012-07-07
  • 打赏
  • 举报
回复
用一个基类,楼主试试是不是这样的

#include "stdafx.h"
#include <iostream>

template<unsigned B>
struct BB
{
void Func1 () { std::cout << "f1" << std::endl; }
};

template<>
struct BB<16>
{
void Func1 () { std::cout << "f16" << std::endl; }
};

template<class T, unsigned B>
struct Base:public BB< B>
{
void Func2 () { std::cout << "f2" << std::endl; }
};


int _tmain(int argc, _TCHAR* argv[])
{
Base<int,0> b0;
Base<float,16> b16;

b0.Func1();
b16.Func1();

return 0;
}

lanzhengpeng2 2012-07-06
  • 打赏
  • 举报
回复
template<class T>
class Base
{
template<unsigned B>
void Func(){}
};

Base<T> b;
b.Func<16>();
lanzhengpeng2 2012-07-06
  • 打赏
  • 举报
回复
template<class T, unsigned B>
class Base
{
//应被特化的函数
void Func();//故意不实现
};

template<class T>
class Base<T,16>
{
void Func(){...}
};
Star-light 2012-07-05
  • 打赏
  • 举报
回复
c++版的回字有四种写法么。。。
不得不说每种方法都很有用
17楼 一般类的特化,需要重写整个类比较麻烦
22楼 用了函数对象,特化函数对象避免像17楼里重写整个类,但是失去了类信息

19楼 用了enable_if,但是如果要对多个值进行特化比较麻烦。
实现上有点问题,这样写也许可以

template<class T, unsigned B>
struct Base
{
template <unsigned N>
typename ::enable_if<16!=N>::type
FuncImpl () { std::cout << "primary" << std::endl; }

template <unsigned N>
typename ::enable_if<16==N>::type
FuncImpl () { std::cout << "specialization" << std::endl; }
void Func() {
FuncImpl<B>();
}
};

44楼 用了函数重载,根据不同的B的参数选择不同的重载函数,应该是最灵活的方式了。

这帖子长知识。
竞天问 2012-07-05
  • 打赏
  • 举报
回复
[Quote=引用 49 楼 的回复:]

引用
我的这个类有很多函数,但只有一个函数的实现需要依赖于第2个值参数,如果把整个类特化就得把其它所有的函数代码复制一遍。

我想实现的就是#16的效果,只是想通过在编译期的模板实现。


99%的模板元编程应用都可以归咎于最初不合理的类设计。

楼主好好考虑一下,为什么把这个需要特化的函数放在这样一个通用类中。
[/Quote]

那我应该怎么做,现在就是有一个模板类,其中一个函数,这个函数在某一特定模板参数时是可以优化的。
现在应该怎么做?
zerofantasy 2012-07-05
  • 打赏
  • 举报
回复
[Quote]
我的这个类有很多函数,但只有一个函数的实现需要依赖于第2个值参数,如果把整个类特化就得把其它所有的函数代码复制一遍。

我想实现的就是#16的效果,只是想通过在编译期的模板实现。
[/Quote]

99%的模板元编程应用都可以归咎于最初不合理的类设计。

楼主好好考虑一下,为什么把这个需要特化的函数放在这样一个通用类中。
cn00512000 2012-07-05
  • 打赏
  • 举报
回复
典型的程序员的严谨思维,容不得一个字的错误[Quote=引用 12 楼 的回复:]

引用 9 楼 的回复:

引用 7 楼 的回复:

编译器相关?测试了下,g++ 4.6.3 毫无压力!


你怎么写的啊,帖一下好不?

写错了,应该是“贴一下”
[/Quote]
竞天问 2012-07-03
  • 打赏
  • 举报
回复
[Quote=引用 44 楼 的回复:]

引用 43 楼 的回复:

引用 42 楼 的回复:
你不是在 #22 已经“大功告成”了吗,怎么这会又说目标实现不了了?


还得让函数对象访问外部成员,费劲不讨好。

我说的实现不了就是 不能对成员函数偏特化

嗨,那你用这个吧。试了一下,连 VS2010 都能编译了。
C/C++ code

#include <iostream>

namespace
{
t……
[/Quote]

网上说C++不支持成员函数偏特化就是怕与重载冲突,看到这句时怎么就没想到用重载解决问题呢
ri_aje 2012-07-03
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 的回复:]

引用 42 楼 的回复:
你不是在 #22 已经“大功告成”了吗,怎么这会又说目标实现不了了?


还得让函数对象访问外部成员,费劲不讨好。

我说的实现不了就是 不能对成员函数偏特化
[/Quote]
嗨,那你用这个吧。试了一下,连 VS2010 都能编译了。

#include <iostream>

namespace
{
template <bool,typename T,typename> struct conditional { typedef T type; };
template <typename T,typename U> struct conditional<false,T,U> {typedef U type; };
}

template<class T, unsigned B>
struct Base
{
void Func ()
{
typedef typename ::conditional<B!=16,primary_t,spec_t>::type type;
Func_impl(type());
}

private:
struct primary_t { };
struct spec_t { };

void Func_impl (primary_t) { std::cout << "primary" << std::endl; }
void Func_impl (spec_t ) { std::cout << "specialization" << std::endl; }
};

int main ()
{
{
Base<int,0> b;
b.Func();
}
{
Base<int,16> b;
b.Func();
}

return 0;
}

Func_impl 是普通成员函数,应该都你玩的了。
竞天问 2012-07-03
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 的回复:]
你不是在 #22 已经“大功告成”了吗,怎么这会又说目标实现不了了?
[/Quote]

还得让函数对象访问外部成员,费劲不讨好。

我说的实现不了就是 不能对成员函数偏特化
ri_aje 2012-07-02
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 的回复:]

引用 40 楼 的回复:

引用 34 楼 的回复:

引用 33 楼 的回复:

这个看起来舒服,不过是不正确的。因为 c++ 不允许定义偏特化类模板成员,而不定义该偏特化类模板。


问题是,我用vs2010编译运行成功了。
编译器优化的原因?

原因(我猜)是 vs2010 的 bug,#36 就编译不过去,可能是因为更新版本的不存在这个 bug。#37 第二……
[/Quote]
你不是在 #22 已经“大功告成”了吗,怎么这会又说目标实现不了了?
竞天问 2012-07-02
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 的回复:]

引用 34 楼 的回复:

引用 33 楼 的回复:

这个看起来舒服,不过是不正确的。因为 c++ 不允许定义偏特化类模板成员,而不定义该偏特化类模板。


问题是,我用vs2010编译运行成功了。
编译器优化的原因?

原因(我猜)是 vs2010 的 bug,#36 就编译不过去,可能是因为更新版本的不存在这个 bug。#37 第二个例子是正确的,因为该例子中是类模……
[/Quote]

反正综合各方面来说,我的目的是不能实现了!

其实本来也就一个分支的事儿,算了,打住吧,谢谢了!
ri_aje 2012-07-02
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 的回复:]

引用 33 楼 的回复:

这个看起来舒服,不过是不正确的。因为 c++ 不允许定义偏特化类模板成员,而不定义该偏特化类模板。


问题是,我用vs2010编译运行成功了。
编译器优化的原因?
[/Quote]
原因(我猜)是 vs2010 的 bug,#36 就编译不过去,可能是因为更新版本的不存在这个 bug。#37 第二个例子是正确的,因为该例子中是类模板成员的显示特化,而非偏特化。
竞天问 2012-07-02
  • 打赏
  • 举报
回复
两个模板参数同时特化也行
加载更多回复(37)

65,180

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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