如何将模板-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;
};
现在你知道 type
是 char
。
-- 编辑--
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>>
。
我写了一个模板 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;
};
现在你知道 type
是 char
。
-- 编辑--
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>>
。