У меня есть классы:
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);
}
}
};
Проблема в том, что в зависимости от класса Policy signalFailure либо выдает, либо возвращает nullptr, но я получаю сообщение об ошибке от компилятора (даже если для Policy задано, что он выбрасывает)что он не может преобразовать пустоту в (T *) - в зависимости от того, что я заменил чаем;Теперь я понимаю, в чем проблема - компилятор выполняет проверку синтаксиса и обнаруживает, что из этой Политики signalFailure возвращает void, поэтому он не может его проанализировать, даже если на практике выбрасывает signalFailure.
У меня есть два варианта:
a) либо объявить void * как тип результата signalFailure
b) объявить void как тип результата в fnc и переместить тип результата всписок аргументов этого fnc или
c) сделать какой-то (и вот вам настоящий Q) макрос или метапрограммирование внутри моего fnc, которые будут определены во время компиляции (либо вернуть Policy :: etc, либо просто Policy :: etc)и это, я думаю, будет лучшим вариантом.Конечно, если у кого-то из вас есть идея получше и изящнее, как это сделать, мы с радостью ее покажем.