Я не думаю, что это возможно во время компиляции, за исключением использования флагов компилятора, как @ Эшвин отметил .
Однако, если это нормально, генерировать ошибку во время выполненияВы, возможно, могли бы использовать некоторые приемы, такие как прокси-класс:
template <typename T>
struct Return
{
Return(const T & value)
: value_(value), used_(false)
{}
Return(const Return & other)
: value_(other.value_), used_(false)
{
other.used_ = true;
}
Return & operator=(const Return & other)
{
other.used_ = true;
value_ = other.value;
return *this;
}
operator T() const
{
used_ = true;
return value_;
}
~Return() // generates an error if the value hasn't been used
{
assert(used_);
}
private:
T value_;
mutable bool used_;
};
Return<int> foo()
{
return 42;
}
int main()
{
int i = foo(); // ok
std::cout << foo() << std::endl; // ok
foo(); // assertion failed
}
Вам просто нужно изменить тип возвращаемого значения вашей функции, чтобы она возвращала Return<Vec3f>
, и вы должны получить ошибку, еслирезультат функции не используется.Однако я не уверен, что рекомендую это, поскольку это делает код менее понятным и, вероятно, также может быть использовано неправильно.Пока ваша функция хорошо документирована, вы должны быть уверены в своих пользователях:)!