【问题标题】:Creating member function template specialization in C++在 C++ 中创建成员函数模板特化
【发布时间】:2012-11-09 21:36:06
【问题描述】:

我正在编写一个类,我想在其中创建这样的成员函数模板专业化

namespace aha
{
class Foo
{
public:
    template < typename T >
    T To() const
    {
        // some code here
    }
};
template <>
bool Foo::To < bool > () const
{
    // some other code here
}
}

gcc 给出错误:

在实例化后显式实例化'To '

我只想对成员函数进行模板特化,这样我的库的用户在将Foo 转换为不同的数据类型时可以获得相同的函数

Foo obj;
bool b( obj.To < std::string > () );
int i( obj.To < int > () );
float f( obj.To < float > () );

等等。

请让我知道我在代码中做错了什么。

【问题讨论】:

  • 您的示例使用 g++ 4.6.3 编译得很好。
  • 您的意思是“在实例化后显式 specialization of 'To'”吗?你在专业化之前是否在某处使用To&lt;bool&gt;
  • 使用 gcc-4.7.2 和 Comeau C++ Online 编译良好。你用的是哪个编译器?

标签: c++ templates


【解决方案1】:

在实例化后显式实例化'To '

上面已经说明了一切:在它的通用版本已经被使用之后,它变得专门化。

函数模板特化可以通过重载来模拟,这是一种更灵活的机制(例如,函数模板没有部分特化,但通过重载可以达到预期的效果):

template<class T> struct Type {}; // similar to boost::type<>

class Foo
{
    template<class T>
    T doTo(Type<T>) const; // the generic version

    bool doTo(Type<bool>) const; // an overload for bool only
    // add more overloads as you please

public:
    template < typename T >
    T To() const {
        return this->doTo(Type<T>());
    }
};

【讨论】:

  • 您是否在 doTo 方法中忘记了 const
  • @Mark 不,我没有忘记我的 doTo 方法中的 const 。你的技术解决了我的问题。但是,我不确定 template struct Type {}; 的需要是什么?我用简单的非模板类型创建了我的 doTo 方法,比如 bool doTo(bool) const;它工作正常。
  • @SaurabhSinha Type&lt;T&gt; 为 T 创建一个独特的类型,不能转换为任何其他 Type&lt;U&gt;。它主要用于根据参数的确切类型重载函数。就像上面的代码一样。
猜你喜欢
  • 2013-09-24
  • 1970-01-01
  • 1970-01-01
  • 2012-12-15
  • 2012-04-03
  • 1970-01-01
相关资源
最近更新 更多