首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于类模板参数专门化C++成员函数

基于类模板参数专门化C++成员函数
EN

Stack Overflow用户
提问于 2011-07-14 23:45:06
回答 1查看 2.6K关注 0票数 5

我有一个带有模板参数的类,它应该决定它包含两种数据样式中的哪一种。基于这个参数,我想用两种不同的方法来实现一个成员函数。我尝试使用Boost Enable-If,但没有成功。下面是我最惊讶的代码不能工作的版本:

代码语言:javascript
复制
#include <boost/utility/enable_if.hpp>
enum PadSide { Left, Right };
template <int> struct dummy { dummy(int) {} };

template <PadSide Pad>
struct String
{
    typename boost::enable_if_c<Pad ==  Left, void>::type
        getRange(dummy<0> = 0) {}
    typename boost::enable_if_c<Pad == Right, void>::type
        getRange(dummy<1> = 0) {}
};

int main()
{
    String<Left> field;
    field.getRange();
}

对于这一点,g++ 4.6.0说:

代码语言:javascript
复制
no type named ‘type’ in ‘struct boost::enable_if_c<false, void>’

当然,第二个重载应该不起作用,但由于SFINAE,它应该被忽略。如果我删除伪函数参数,g++会这样说:

代码语言:javascript
复制
‘typename boost::enable_if_c<(Pad == Right), void>::type
    String<Pad>::getRange()‘
cannot be overloaded with
‘typename boost::enable_if_c<(Pad == Left), void>::type
    String<Pad>::getRange()‘

这就是我把伪参数放在第一位的原因--遵循the documentation的编译器变通方法部分。

基本上,我想要的是有两个getRange()的实现,并根据Pad类型选择其中之一。我希望Enable-If可以让我在不创建辅助类的情况下完成这项工作(我将在此期间尝试)。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-07-14 23:56:54

由于您无论如何都要制作两个不同版本的getRange(),因此您可以根据PadSide的类型重载struct String成员函数。我知道它不是那么“漂亮”,但最终,它仍然是类似的代码量,并且您不必创建多个类类型。

代码语言:javascript
复制
template<PadSide Pad>
struct String
{
    void getRange();
};

template<>
void String<Right>::getRange() { /*....*/ }

template<>
void String<Left>::getRange() { /*....*/ }
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6696033

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档