Изменение типа возврата функции без шаблонной специализации. C++

Решено отсутствие анимации при перемещении справа налево при перелистывании первой страницы к последней и наоборот

Небольшое изменение в ответе @tobi_b решило мою проблему. для этого добавьте копию последней страницы в начальной и первой страницы в последнюю. Затем просто удалите оператор NOT из метода ниже в PagerAdapter. И замените setCurrentItem (lastposition, false) на setCurrentItem (lastposition-1, false) и setCurrentItem (0, false) для setCurrentItem (1, false).

private void setNextItemIfNeeded() {
    if (isScrollStateSettling()) {
        handleSetNextItem();
    }
}

private boolean isScrollStateSettling() {
    return mScrollState == ViewPager.SCROLL_STATE_SETTLING;
}
private void handleSetNextItem() {
    final int lastPosition = pager.getAdapter().getCount() - 1;
    if(mCurrentPosition == 0) {
        pager.setCurrentItem(lastPosition-1, false);
    } else if(mCurrentPosition == lastPosition) {
       pager.setCurrentItem(1, false);
    }
}

И в вашем MainActivity.java не забудьте установить текущий элемент равным 1. Надеясь, это поможет некоторым.

14
задан Benoît 17 May 2010 в 14:35
поделиться

7 ответов

Это можно сделать с помощью функции преобразования

struct proxy {
    string str;
    proxy(string const &str):str(str) { }
    template<typename T> operator T() { 
        return boost::lexical_cast<T>(str); 
    }
};

proxy parse(string const &str) { return proxy(str); }

Теперь вам просто нужно сделать

float a = parse("3.1");

И это должно работать хорошо. Кстати, вы можете просто использовать класс напрямую. Я рекомендую переименовать его в conversion_proxy , чтобы указать на тот факт, что это просто прокси для происходящего преобразования, но сам он не выполняет преобразование

struct conversion_proxy {
    string str;
    conversion_proxy(string const &str):str(str) { }
    template<typename T> operator T() { 
        return boost::lexical_cast<T>(str); 
    }
};

float a = conversion_proxy("3.1"); 
31
ответ дан 1 December 2019 в 06:16
поделиться

К сожалению, это невозможно. В C ++ невозможно перегрузить функцию на основе ее возвращаемого значения. У вас либо должно быть 3 функции: ParseInt, ParseFloat и ParseBool, либо использовать шаблон функции.

0
ответ дан 1 December 2019 в 06:16
поделиться

Я бы согласился с литбом, который был немного быстрее меня. Используйте операторы приведения.

#include <iostream>
#include <string>
#include <sstream>

class Convertible
{
public:
    int m_Integer;
    bool m_Bool;
    double m_Double;

    Convertible() : m_Integer(0), m_Bool(false), m_Double(0.0) {};

    operator int() const
    {
        return m_Integer;
    }
    operator bool() const
    {
        return m_Bool;
    }
    operator double() const
    {
        return m_Double;
    }
};

Convertible parse(std::string data)
{
    Convertible l_result;

    std::istringstream converter(data);
    converter >> l_result.m_Integer;

    std::istringstream converter2(data);
    converter2 >> l_result.m_Bool;

    std::istringstream converter3(data);
    converter3 >> l_result.m_Double;

    return l_result;
}

void main()
{
    int l_convertedInt = parse("2");
    bool l_convertedBool = parse("true");
    double l_convertedDouble = parse("3.14");

    std::cout << "Converted '2' to " << l_convertedInt << std::endl;
    std::cout << "Converted 'true' to " << l_convertedBool << std::endl;
    std::cout << "Converted '3.14' to " << l_convertedDouble << std::endl;
}
3
ответ дан 1 December 2019 в 06:16
поделиться

Я не могу сказать по вашему вопросу, знаете вы это или нет, но вы действительно можете сделать это с помощью шаблона. Единственная загвоздка в том, что вам нужно будет указывать тип, из которого вы преобразуете, в каждом вызове вместо того, чтобы полагаться на вывод (поскольку, как вы сказали, тип аргумента всегда будет тем же самым).

template<typename T> T parse(const string& str) { /* do stuff for other types */ }
template<> int parse<int>(const string& str) { /* do stuff for ints */ }
template<> double parse<double>(const string& str) { /* do stuff for doubles */ }
template<> bool parse<bool>(const string& str) { /* do stuff for bools */ }
// etc.

А затем вызывать как

int value = parse<int>("37");
double value = parse<double>("3.14");
bool value = parse<bool>("true");

Если вы уже знали это, просто проигнорируйте этот ответ, но из вашего вопроса не ясно, знаете ли вы, что это возможно.

Конечно, если то, что вы делаете, не

12
ответ дан 1 December 2019 в 06:16
поделиться

Вы можете передать свой выходной аргумент как указатель или ссылку.

Примерно так:

template<class T> void parse(const std::string &input, T& output);

Затем введите такой код:

double d; parse(input, d);
int i; parse(input, i);

должен работать.

Однако ваш код выглядит как идеальный вариант для std :: istringstream, который был бы просто:

istringstream is(input);
input >> d;

Если у вас есть несколько сложное форматирование, уловка, с которой мне очень повезло, включает создание пользовательских объектов с помощью специального оператора >>, который извлекает данные.

Тогда это могло быть так:

istringstring is(input);
input >> LineExtracter(x, y, d);
5
ответ дан 1 December 2019 в 06:16
поделиться

Нет, такое поведение невозможно в C ++. Чтобы быть допустимым, необходимо иметь возможность определять функции с одним и тем же именем в одной и той же области, которые различаются только типом возвращаемого значения. Это недопустимо в C ++.

C ++ может выполнять некоторую специализацию типа возвращаемого значения, такую ​​как ковариантные типы возвращаемого значения для переопределенных виртуальных функций. Но он не поддерживает то, что вы ищете.

0
ответ дан 1 December 2019 в 06:16
поделиться

Вы можете вернуть void * и затем привести результат по мере необходимости.

Я не советую этого делать. C ++ - это строго типизированный язык. Преимущество этого заключается в том, что компилятор может обнаруживать ошибки раньше, чем язык с динамической типизацией.

0
ответ дан 1 December 2019 в 06:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: