Как специализировать шаблон-класс с двойниками? - PullRequest
1 голос
/ 20 сентября 2019

Я пишу шаблонный класс, зависящий от данного типа и переменных типов, например:

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
}

1 Ответ

1 голос
/ 20 сентября 2019

Проблема в том, что

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.

- РЕДАКТИРОВАТЬ -

ОП запрашивает

Есть ли короткий / элегантный способ справиться с обоими случаями, как постоянными, так и неконстантными, без дублирования кода?

Не знаю, элегантно ли это, но мне кажется, что он короткийдостаточно: вы можете использовать своего рода наследование, добавив следующую частичную специализацию.

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

Итак, X<ConstantTensor<Scalar> const> наследуется от X<ConstantTensor<Scalar>>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...