我写了一个依赖于给定类型和可变参数类型的模板类,如下所示:
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;
};
现在,您知道
type
是char
。-编辑-
OP问
我不知道它是否优雅,但是在我看来似乎很短:您可以使用一种自我继承来添加以下部分特化知识。
template <typename T>
class X<T const> : public X<T>
{ };
因此
X<ConstantTensor<Scalar> const>
继承自X<ConstantTensor<Scalar>>
。