Нетипичный параметр шаблона, зависящий от параметра типа шаблона по умолчанию - PullRequest
1 голос
/ 04 июля 2019

Есть ли способ (в C ++ 17) добиться чего-то похожего на предварительное объявление в шаблоне?То, чего я хочу достичь, это что-то вроде этого:

template<typename T, SizeType D, typename SizeType = int>

Очевидно, что здесь D зависит от SizeType, поэтому оно должно предшествовать этому.Но в этом случае я не могу установить параметр по умолчанию, если D также не имеет параметра по умолчанию (который я не хочу).По сути, я хочу иметь возможность «объявить» SizeType перед D, но «определить» его после него.

Редактировать: Вот пример того, как я хотел бы использовать его:

template<typename T, SizeType D, typename SizeType = int>
class StaticArray{};
//...
StaticArray<float, 5> s; // = StaticArray<float, 5, int>
StaticArray<float, (1<<40), size_t>; // 1<<40 doesn't fit in int

Ответы [ 2 ]

2 голосов
/ 04 июля 2019

Вы могли бы сделать что-то подобное

template<typename T, auto DArg, typename SizeType = int, SizeType D = DArg>

Теперь указывается аргумент для D, затем тип D, и, наконец, аргумент преобразуется в D правильного типа.

0 голосов
/ 04 июля 2019

Я придумал что-то еще, учитывая ответ StoryTeller и комментарии:

template<typename T, auto D>

Пример минимального решения для будущих читателей:

#include <iostream>
template<typename T, auto D>
class StaticArray
{
public:
    using size_type = decltype(D);
};

int main()
{
    StaticArray<float, 5ul> s;
    std::cout << typeid(decltype(s)::size_type).name() << "\n";
    return 0;
}

Вот также пример, иллюстрирующий «принудительное преобразование» и его последствия:

 #include <iostream>
template<typename T, auto D, typename SizeType = decltype(D)>
class StaticArray
{
public:
    using size_type = SizeType;
    static const size_type convertedDim = static_cast<size_type>(D);
    static const decltype(D) Dim = D;
};

int main()
{
    StaticArray<float, 1ull<<40, int> s;
    std::cout << typeid(decltype(s.Dim)).name() << "\n";
    std::cout << s.Dim << "\n";
    std::cout << typeid(decltype(s.convertedDim)).name() << "\n";
    std::cout << s.convertedDim << "\n";
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...