Если вы не хотите использовать какой-либо объект, вы можете использовать setattr()
внутри вашего текущего модуля:
import sys
current_module = module = sys.modules[__name__] # i.e the "file" where your code is written
setattr(current_module, 'variable_name', 15) # 15 is the value you assign to the var
print(variable_name) # >>> 15, created from a string
Причина в том, что declval
генерирует временный объект, поэтому, если у вашего кода есть другая перегрузка, такая как
ostream& operator<<(ostream&& out, const Foo& foo) noexcept { return out << foo.value; }
, он будет работать. Обратите внимание, что перегруженная функция принимает ссылку на rvalue. Я проверил это с gcc 4.8.5 и -std=c++11
.