Специализация шаблона C++, в которой <int&> не принимает int
-
06-07-2019 - |
Вопрос
У меня есть следующий код:
template <typename T> LuaCall& operator>>(T) { BOOST_STATIC_ASSERT(sizeof(T) == 0); }
template <> LuaCall& operator>><int&>(int& val) { mResults.push_back(std::make_pair(LUA_RESULT_INTEGER, (void *)&val)); return *this; }
template <> LuaCall& operator>><float&>(float& val) { mResults.push_back(std::make_pair(LUA_RESULT_FLOAT, (void *)&val)); return *this; }
template <> LuaCall& operator>><double&>(double& val) { mResults.push_back(std::make_pair(LUA_RESULT_DOUBLE, (void *)&val)); return *this; }
template <> LuaCall& operator>><bool&>(bool& val) { mResults.push_back(std::make_pair(LUA_RESULT_BOOLEAN, (void *)&val)); return *this; }
template <> LuaCall& operator>><std::string&>(std::string& val) { mResults.push_back(std::make_pair(LUA_RESULT_STRING, (void *)&val)); return *this; }
template <> LuaCall& operator>><LuaNilStruct>(LuaNilStruct) { mResults.push_back(std::make_pair(LUA_RESULT_NIL, (void *)NULL)); return *this; }
А потом:
int abc;
LuaCall(l, "test") % "test" % 5 % LuaNil % 2.333 >> abc;
Я хочу, чтобы он работал примерно так же, как cin >>, то есть ему нужно записать в abc возвращаемое значение функции lua.Поэтому мне нужен его адрес..но по умолчанию используется шаблон по умолчанию.Что я делаю не так?Конечно, есть способ сделать это, поскольку cin делает именно это.
Спасибо!
Примечание для тех, кто изменил % на >>:Я изменил его обратно, потому что так оно и есть :D Код вызывает функцию Lua test("test", 5, nil, 2.333) и сохраняет возвращаемое значение в abc.% предназначены для параметров функций, >> — для возвращаемых значений.
template <typename T>
LuaCall& operator%(T val) {
mLua->Push(val);
++mArguments;
return *this;
}
Решение
Вы написали оператор>> как унарный оператор, но это бинарный оператор. LeftHandSide >> RightHandSide
.
Форма std::cout <"Hello" << " world";
поэтому является (operator<<(operator<<(std::cout, "Hello"), " world)
;- первый <<
возвращает std::cout для использования в качестве левой части второго <<
.
Настоящая проблема заключается в том, что в вашем коде поиск происходит следующим образом:
- Определены функции-кандидаты (только один кандидат, шаблон)
- Выводится Т.
- Определите, какую специализацию (если таковая имеется) создать.
На шаге 2 T==int.На этапе 3 нет специализаций для T==int
поэтому базовый шаблон выбран и создан.Возможно, вы захотите использовать перегрузку вместо специализации.Перегрузка будет лучше соответствовать шагу 1, поэтому вы даже не доберетесь до момента вывода аргумента шаблона.
Другие советы
Вы не можете использовать постоянные значения ("test" , 5 or 2.333
), где ожидаются ссылки.Измените шаблон и тип параметра вашего operator>>
к (int, float
и т. д.), когда вы хотите такого поведения.
Для одного, operator>>
это двоичный оператор.Это означает, что он должен принимать два аргумента.Первый аргумент должен быть любым типом
LuaCall(l, "test") % "test" % 5 % LuaNil % 2.333
Поскольку этот оператор возвращает LuaCall&
, я полагаю, что именно таким является результат этого вызова (и, следовательно, левого аргумента).
От этого mResult
Я предполагаю, что вы пытаетесь выполнить этот оператор как член класса.Но я не думаю, что вы можете специализировать шаблоны участников.
Наконец, я не думаю, что вам следует специализироваться на ссылочных типах.Этот
template <> LuaCall& operator>><int>(int val);
следует сделать