Обеспечение ограничений для пакета параметровC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Обеспечение ограничений для пакета параметров

Сообщение Anonymous »

У меня есть шаблонный класс, который содержит кортеж. < /p>
template
class Foo
{ ... };

Как я могу применить ограничение на типы, содержащиеся в пакете параметров -параметров?template < template class... SomeTypes>
class Bar
{ ... };
< /code>

Вот более конкретный случай того, что я ищу. Код не должен (и не) компилировать, потому что foob не является заполненным. Я надеюсь, что смогу добавить какое -то предложение «Требуется к Foocontainer , что дало бы гораздо более четкую ошибку».
#include
#include

template
class Foo
{
};

template
class FooA : public Foo
{
public:
int some_data {0};

void DoSomething()
{
some_data++;
}
};

template
class FooB : public Foo
{
public:
// non-copyable object
FooB() = default;
FooB( const FooB& ) = delete;
FooB& operator=( const FooB& ) = delete;
~FooB() = default;

int some_data {0};

void DoSomething()
{
some_data++;
}
};

template < template class... SomeTypes>
// requires (std::copyable) ???
class FooContainer
{
public:
std::tuple my_tuple;

template
void DoAllThings()
{
}

template
void DoAllThings()
{
std::get(my_tuple).DoSomething();
DoAllThings();
}
};

using MyContainer = FooContainer;

int main()
{
MyContainer my_bar;
my_bar.DoAllThings();
MyContainer my_bar2 = my_bar;
}
< /code>
-редактировать 2-< /p>
Так что после поиска с некоторыми из предложений здесь, самое близкое, что я придумал к тому, что я хотел,-это использовать внешнюю статическую функцию для выполнения чека. < /p>
template
requires (std::copyable)
constexpr bool FooTypeCheck()
{
return true;
}

static_assert(FooTypeCheck());
< /code>
Это дает мне чек, который я хочу (это полученный класс Foo Coperable), и поэтому для проще считывания вывода компилятора, если проверка не удастся. Для цели проверки типа контейнер не имеет значения, поэтому я просто прохожу Int.
, к сожалению, это также означает, что мне нужно добавить static_assert для каждого урока Foo Foo, а int я передаю контейнер, немного странно. Поскольку параметр ContainerType является лишь частью CRTP, это не имеет значения для целей ограничения, и я могу просто использовать Int, и решение немного проще. < /P>
template
concept FooTypeCheck = std::copyable;

template < template class... SomeTypes>
requires (... && FooTypeCheck)
class FooContainer
{ ... };


Подробнее здесь: https://stackoverflow.com/questions/795 ... meter-pack
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»