тип, чтобы помочь разрешению перегрузки. (отправка тегов, если я не ошибаюсь)
Когда вы хотите использовать сложный шаблон специализации шаблона для какой-либо функции, вы не пытаетесь go напрямую использовать ее, а пишите:
template <typename T1, typename T2, other things maybe>
int foo(T1 param1, T2 param2 and so on)
{
using tag = put your complex stuff here, which produces an empty struct
detail::foo_impl(tag, std::forward<T1>(param1), std::forward<T2>(param2) and so on);
}
Теперь компилятору не нужно выбирать между конкурирующими вариантами специализации шаблона, поскольку с разными тегами вы получаете несовместимые функции.
базовый интерфейс
struct vehicle { };
namespace mixins {
struct named { std::string name; };
struct wheeled { int num_wheels; public; rev() { }; }
} // namespace mixins
struct private_sedan : public vehicle, public wheeled, named {
// I dunno, put some car stuff here
};
Создание базовой структуры полностью пустой, возможно, не так часто, но, безусловно, возможно, если вы часто используете миксины. И вы можете проверить наследование от vehicle
(хотя я не уверен, что я это сделаю).
параметр шаблона
Не уверен, что это значит, но рискну предположить:
template <typename T>
struct foo { }
template <typename T, typename N>
struct foo<std::array<T, N>> {
int value = 1;
}
Если вы теперь используете foo<T>::value
в функции, она будет работать только в том случае, если T
равно int
с несколькими (?) Исключениями.