【问题标题】:How to specialize a template-class with doubles?如何用双打专门化模板类?
【发布时间】:2019-09-20 08:19:23
【问题描述】:

我编写了一个依赖于给定类型和可变参数类型的模板类,如下所示:

template<typename ConstType,typename...Inputs>
class ConstantTensor;

那我再写一个类,一般是这样定义的(假设wrong_type随便你想什么类型,但和下面的特化不一样):

template<typename T>
class X{
public:
using type=wrong_type;
}

我也有这种专长:

template<typename ConstType,typename...Inputs>
class X< ConstantTensor< ConstType ,Inputs...>>
{
public:
using type=right_type;
}

我的问题是,如果我定义了ConstantTensor&lt;ConstType,double&gt; 类型,然后我想使用X&lt;ConstantTensor&lt;ConstType,double&gt;&gt;::type,则调用的是一般情况而不是专业化。所以我得到wrong_type 而不是right_type。我想它必须处理double 类型...你能解释一下为什么以及如何解决这个问题吗?提前谢谢你。

编辑: 这是一个sn-p的代码,我希望它有效:

class Scalar
{};


template<typename ConstType,typename...Inputs>
class ConstantTensor
{
  public:    
  constexpr ConstantTensor(const Inputs&...inputs)
  {}
};

template<typename ConstType,typename...Inputs>
constexpr auto Constant(const Inputs&...inputs)
{return ConstantTensor<ConstType,Inputs...>(inputs...);}

template<typename T>
class X{
public:
using type=int;
};

template<typename ConstType,typename...Inputs>
class X<ConstantTensor<ConstType,Inputs...>>{
public:
using type=char;
};

int main()
{
constexpr auto delta=Constant<Scalar>(2.0);
using type= X<decltype(delta)>::type; // this is int not char
}

【问题讨论】:

  • 无法复制;请问,您能否添加一个完整但最小的示例来重现该问题?
  • 我希望现在实际上更清楚,我写的代码没有错误。

标签: c++ templates c++14 variadic-templates template-specialization


【解决方案1】:

问题是

constexpr auto delta=Constant<Scalar>(2.0);

是一个constexpr 变量;所以它也是const

所以decltype(delta) 不是ConstantTensor&lt;Scalar&gt;,而是ConstantTensor&lt;Scalar&gt; const

您可以验证在部分专业化声明中添加const

template<typename ConstType,typename...Inputs>
class X<ConstantTensor<ConstType,Inputs...> const>{ // <-- added const
public:
using type=char;
};

现在你知道typechar

-- 编辑--

OP 询问

是否有一种简短/优雅的方式来处理 const 和非 const 这两种情况,而无需复制代码?

我不知道它是否优雅,但在我看来它足够短:您可以使用一种自我继承,添加以下部分特化。

template <typename T>
class X<T const> : public X<T>
 { };

所以X&lt;ConstantTensor&lt;Scalar&gt; const&gt; 继承自X&lt;ConstantTensor&lt;Scalar&gt;&gt;

【讨论】:

  • 是否有一种简洁/优雅的方式来处理 const 和非 const 这两种情况,而无需复制代码?
  • @Garo - 答案改进;希望这会有所帮助。
  • 不是同一个班,但我还是很矮,所以我会说完全可以,谢谢!
猜你喜欢
  • 2015-06-15
  • 1970-01-01
  • 1970-01-01
  • 2014-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多