如何将模板-class 专门化为双打?

How to specialize a template-class with doubles?

我写了一个模板 class 依赖于给定类型和可变参数类型,像这样:

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

然后我再写一个class,一般是这样定义的(假设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<ConstType,double> 然后我想使用 X<ConstantTensor<ConstType,double>>::type,一般情况被调用而不是专业化。所以我得到 wrong_type 而不是 right_type。我想它必须处理 double 类型...你能解释一下为什么以及如何解决这个问题吗?提前谢谢你。

编辑: 这是一段代码,我希望它有效:

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
}

问题是

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

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

所以 decltype(delta) 不是 ConstantTensor<Scalar> 而是 ConstantTensor<Scalar> const.

您可以验证在偏特化声明中添加 const

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

现在你知道 typechar

-- 编辑--

OP 询问

Is there a short/elegant way to deal with both cases, const and non const, without duplicating the code?

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

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

所以X<ConstantTensor<Scalar> const>继承自X<ConstantTensor<Scalar>>