Изменить: эта функция должна проверять типы один за другим и возвращать obj любого, который удовлетворяет условию или nullptr.
template <typename... Args, typename = std::enable_if_t<(sizeof...(Args) == 0)>()>
std::nullptr_t f() { return nullptr; }
template <typename T, typename... Args>
BaseClassOfAllArgs* f() {
if (<some condition related to T...>)
return new T;
return f<Args...>();
}
Этот код у меня работает. Но мне интересно, можно ли переписать этот код, чтобы использовать концепцию? Я имею в виду что-то вроде этого:
template <typename... Args>
concept NoArgs = (sizeof...(Args) == 0);
а затем используйте его вместо std :: enable_if (этот код не работает)
template <NoArgs Args>
std::nullptr_t f() { return nullptr; }
template <typename T, typename... Args>
BaseClassOfAllArgs* f() {
if (<some condition related to T...>)
return new T;
return f<Args...>();
}
РЕДАКТИРОВАТЬ: Вот рабочий пример кода после советов от парней в комментариях. После того, как я добавил в шаблон «Base», оказалось, что концепция EmptyPack больше не нужна. И для первого шаблона, естественно, требуется 3 имени типа. Однако я не уверен в этой концепции EmptyPack. Неужели это делает мою программу некорректной и не требует диагностики?
#include <iostream>
#include <type_traits>
#include <typeinfo>
class X {};
class A : public X {};
class B : public X {};
class C : public X {};
class D : public C {};
class E {};
template<class T, class... Args >
concept DerivedsOfBase = (std::is_base_of_v<T, Args> && ...);
template<typename... Args>
concept EmptyPack = sizeof...(Args) == 0;
template<typename T>
std::nullptr_t f() {
std::cout << "End of the types list" << std::endl;
return nullptr;
}
template<typename Base, typename T, typename... Args> requires DerivedsOfBase<Base, T, Args...>
Base* f() {
std::cout << typeid(T).name() << std::endl;
if (<some condition related to T>)
return new T;
return f<Base, Args...>();
}
int main()
{
auto ptr = f<X, A, B, C>();
auto ptr2 = f<X, A, B, D>();
//auto ptr3 = f<X, A, B, E>(); // compile error
return 0;
}
T
для первой перегрузки. - person Barry   schedule 24.08.2020T
. Он хочет, чтобы случай с нулевым аргументом возвращалnullptr
, а не случай с одним аргументом. - person Yakk - Adam Nevraumont   schedule 24.08.2020T
, но здесь нет типа с именемT
. Так что либо где-то должен быть объявленT
, либо функция должна возвращатьnullptr_t
. - person Barry   schedule 24.08.2020