Возможно ли это без серьезного обходного пути создания классов-оберток для обхода?
AFAICS из документов, ответ: нет, вы не можете. Проблема в том, что TestingTypes
принимает типы, но вы хотите передать шаблоны. Единственное решение, которое я вижу, - это создать простой тип-обертку, чтобы перенести интересующий шаблон в функцию теста и создать его экземпляр с нужным параметром шаблона.
Отказ от ответственности: я недостаточно знаком с тестом Google, может быть, есть способ, как это сделать.
Однако, в зависимости от того, что именно вы подразумеваете под "основным обходным решением", следующий код иллюстрирует возможный подход, который я думаю, должен работать. Думаю, усилия не так уж и плохи.
template <class T>
class U { };
template <class T>
class V { };
class A{};
class B{};
template<template<class> typename UorV>
struct TemplateHolder {
template<class Arg>
using type = UorV<Arg>;
};
template<class T, class Arg>
using instantiate_t = typename T::template type<Arg>;
// Mimick what I suspect the google testing::Types and TypeParam are.
template<class... Ts>
struct TestingTypes {};
using types_to_test = TestingTypes<TemplateHolder<U>, TemplateHolder<V>>;
int main( void ) {
using TypeParam = TemplateHolder<U>;
using ActualTypeToTestA = instantiate_t<TestingType, A>;
using ActualTypeToTestB = instantiate_t<TestingType, B>;
static_assert(std::is_same_v<ActualTypeToTestA, U<A>>);
static_assert(std::is_same_v<ActualTypeToTestB, U<B>>);
return 0;
}
Живой код здесь