Специализация шаблона C++, в которой <int&> не принимает int

StackOverflow https://stackoverflow.com/questions/1630406

Вопрос

У меня есть следующий код:

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 для использования в качестве левой части второго <<.

Настоящая проблема заключается в том, что в вашем коде поиск происходит следующим образом:

  1. Определены функции-кандидаты (только один кандидат, шаблон)
  2. Выводится Т.
  3. Определите, какую специализацию (если таковая имеется) создать.

На шаге 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);

следует сделать

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top