У меня есть классы:Проблема с возвращаемым типом
struct Policy_1
{
void signalFailure()
{
throw std::exception();
}
};
struct Policy_2
{
void* signalFailure()
{
return nullptr;
}
};
template<class Policy>
struct My
{
template<class T>
T* fnc(int value)
{
if (!value)
{
return Policy::signalFailure();//Here is the problem
}
else
{
return new int(value);
}
}
};
Проблема заключается в том, что в зависимости от политики класса signalFailure либо бросает или возвращает nullptr, но я получаю сообщение об ошибке от компилятора (даже если политика установлено, что он делает бросить), что он не может преобразовать void в (T *) - в зависимости от того, что я заменил чаем; Теперь я понимаю, в чем проблема: компилятор проверяет синтаксис и обнаруживает, что из этой Политики signalFailure возвращает void, поэтому он не может разобрать его, даже если signalFailure на практике бросает.
У меня есть два варианта, как я вижу это:
а) либо объявить недействительным * в качестве типа результата signalFailure
б) объявить недействительным как тип результата в FNC и переместить тип результата в списке аргументов этого fnc или
c) сделайте макрос или метапрограммирование внутри моего fnc (и вот вам реальное Q), которое будет определено во время компиляции (либо вернуть политику :: etc, либо просто Policy :: и т. д.), и что я думаю будет лучшим вариантом. Конечно, если кто-то из вас имеет лучшую и более элегантную идею, как это сделать, более чем можно его показать.
Не должен ли 'signalFailure()' быть статическим? – sharptooth
@sharptooth Я согласен, хотя я ожидаю, что в реальном коде он создает сообщение об исключении из Policy_1 – Rup