В настоящее время у меня есть map<int, std::wstring>
, но для гибкости я хочу иметь возможность назначать лямбда-выражение, возвращая std::wstring
в качестве значения на карте.
Итак, я создал этот класс шаблонов:
template <typename T>
class ValueOrFunction
{
private:
std::function<T()> m_func;
public:
ValueOrFunction() : m_func(std::function<T()>()) {}
ValueOrFunction(std::function<T()> func) : m_func(func) {}
T operator()() { return m_func(); }
ValueOrFunction& operator= (const T& other)
{
m_func = [other]() -> T { return other; };
return *this;
}
};
и используйте его как:
typedef ValueOrFunction<std::wstring> ConfigurationValue;
std::map<int, ConfigurationValue> mymap;
mymap[123] = ConfigurationValue([]() -> std::wstring { return L"test"; });
mymap[124] = L"blablabla";
std::wcout << mymap[123]().c_str() << std::endl; // outputs "test"
std::wcout << mymap[124]().c_str() << std::endl; // outputs "blablabla"
Теперь я не хочу использовать конструктор для упаковки лямбда, поэтому я решил добавить второй оператор присваивания, на этот раз для std::function
:
ValueOrFunction& operator= (const std::function<T()>& other)
{
m_func = other;
return *this;
}
Это тот момент, когда компилятор начинает жаловаться. Строка mymap[124] = L"blablabla";
неожиданно приводит к этой ошибке:
ошибка C2593: 'operator = is неоднозначно'
IntelliSense дает дополнительную информацию:
более чем один оператор "=" соответствует этим операндам: function "ValueOrFunction:: operator = (const std:: function & other) [с T = std:: wstring]" function "ValueOrFunction:: operator = (const T & other) [with T = std:: wstring]" Типы операндов: ConfigurationValue = const wchar_t [10] c:\projects\beta\CppTest\CppTest\CppTest.cpp 37 13 CppTest
Итак, мой вопрос: почему компилятор не может отличить std::function<T()>
и T
? И как я могу это исправить?