【问题标题】:C++ specialize single method in template classC++ 专门化模板类中的单个方法
【发布时间】:2015-11-11 16:33:34
【问题描述】:

我有一个现有的模板类,它适用于所有类型的数据类型。但是现在我需要将它专门用于派生自特定类的类。但不是整个类都应该专门化,而只是一些功能。

我尝试按照this post 中的描述进行操作。

class BaseClass
{
   public:

   bool DoSomething()
   {
       return true;
   }
};

class SubClass : BaseClass
{
};

template<typename T, typename _Alloc = std::allocator<T>>
class TemplateClass
{
   public:
    template<typename U = T, typename std::enable_if<
       !std::is_base_of<BaseClass, U>::value>::type>
    void print_line()
    {
       std::cout << "Parameter of general Type T" << std::endl;
    }

    template<typename U = T, typename std::enable_if<
       std::is_base_of<BaseClass, U>::value>::type>
    void print_line()
    {
       std::cout << "Parameter of specific Type BaseClass" << std::endl;
    }
};

我尝试使用这样的模板:

TemplateClass<BaseClass>* tc1 = new TemplateClass<BaseClass>();
tc1->print_line();

TemplateClass<SubClass>* tc2 = new TemplateClass<SubClass>();
tc2->print_line();

TemplateClass<int>* tc3 = new TemplateClass<int>();
tc3->print_line();

对于每个函数调用,我都会收到错误,找不到合适的方法。 另一点是this article 他们说 enable_if 不应该用于在实现之间进行选择。

有谁知道我的错误是什么或如何正确地做到这一点? 提前致谢!

【问题讨论】:

  • 你试过标签调度吗?

标签: c++ templates specialization


【解决方案1】:

你可以改成

template<typename U = T, typename std::enable_if<
   !std::is_base_of<BaseClass, U>::value>::type* = nullptr>
void print_line()
{
   std::cout << "Parameter of general Type T" << std::endl;
}

template<typename U = T>
typename std::enable_if<!std::is_base_of<BaseClass, U>::value, void>::type print_line()
{
   std::cout << "Parameter of general Type T" << std::endl;
}

和另一个相应的。

两者背后的想法是在函数模板的实例化期间为其中一种方法产生错误。由于该错误,在重载解析期间不考虑相应的方法,因此只有一种方法(未产生错误的方法)可用,然后将调用该方法。 std::enable_if 用于产生此错误,因为如果它的第一个参数是 false 它没有定义 type 成员,因此函数模板无法实例化,并将从重载决议中删除。

搜索 SFINAE 了解更多详细信息。

【讨论】:

  • 这适用于我上面描述的测试项目。但是当我尝试以两种可能性之一来实现它时,我总是得到“C4519 默认模板参数只允许在类模板上使用”。当我这样做时: template typename std::enable_if<:is_base_of value_type>::value, iterator>::type 我收到错误“C2039 'type': is not a member of 'std::enable_if<_test>'" 你知道为什么它在生产项目中不起作用吗?类签名与之前描述的相同。
猜你喜欢
  • 2013-04-09
  • 2014-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多