Я не знаю способа вывести аргумент шаблона T
для родителя baked
potato<T>
. Вы можете узнать T
, используя decltype(p.something)
, но, похоже, это не поможет решить проблему с вызовом конструктора. Один из обходных путей - изменить конструктор baked
на любой O
и предположить, что он имеет something
:
struct baked {
template <class O>
baked(const O & p) : something(static_cast<T>(p.something))
{ }
baked() = default;
T something;
};
Это будет работать, но это менее безопасно для типов, чем, как кажется, предполагается вашим исходным кодом. Одним из способов решения проблемы , в которой проблема , может быть введение static_assert
, проверяющего, что O
действительно potato<U>::baked
:
#include <type_traits>
template <class T>
struct potato {
struct baked {
template <class O>
baked(const O & p) : something(static_cast<T>(p.something))
{
using t_parent = potato<decltype(p.something)>;
static_assert(std::is_same<O, typename t_parent::baked>::value, "Not a baked potato!");
}
baked() = default;
T something;
};
template <class O>
potato(const potato<O>& p)
: mybaked(p.mybaked) {
}
potato() = default;
baked mybaked;
};
Это должно скомпилироваться нормально для предполагаемого использования, но не с "Не печеная картошка!" если вы попытаетесь передать что-нибудь еще с something
. Это не удастся:
struct foo {
int something = 0;
};
int main(int, char**) {
foo bar;
potato<int>::baked baz(bar); // Error: Not a baked potato!
}