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

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<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问



我不知道它是否优雅,但是在我看来似乎很短:您可以使用一种自我继承来添加以下部分特化知识。
template <typename T>
class X<T const> : public X<T>
 { };

因此X<ConstantTensor<Scalar> const>继承自X<ConstantTensor<Scalar>>

10-04 14:29