Шаблон C ++: сохранение информации о типовых значениях без сохранения в конструкторе - PullRequest
0 голосов
/ 03 марта 2012

Предположим, у меня есть следующий класс шаблона:

template<unsigned char I, unsigned char F>
class FOO
{
  ....
}

В основной функции у меня много таких переменных, с разными (I, F), такими как:

int main()
{
   .....
   FOO<4, 2> a;
   FOO<6, 3> b;
   ......
}

Я хочу сохранить значение I или F для определенных переменных в моей основной функции. Конечно, я могу определить открытые / закрытые члены для FOO и сохранить значение (I, F) внутри конструктора FOO, например

template<I,F>
FOO<I,F>::FOO(){
   i = I;
   f = F;
}

Недостаток этого метода очевиден: он увеличивает размер FOO. IMO, (I, F) любой переменной может быть определен во время компиляции, поэтому должен быть способ сделать это без создания локальной переменной.

Ответы [ 3 ]

2 голосов
/ 03 марта 2012

В своем определении класса вы можете просто ссылаться на параметры буквально (как и любые другие параметры шаблона!).

Но предположим, у вас есть это:

typedef Foo<10, 20> MyFoo;

MyFoo x;   // what is I, what is K?

Обычно нужно отразить параметры шаблона внутри определения класса:

template <int A, typename T> struct Foo
{
    static int const a_value = A;
    typedef T               type;
    // ...
};

Теперь вы можете сказать: MyFoo::type x; return MyFoo::a_value; и т. Д. Обратите внимание, что интегральные константы статического класса обычно не нуждаются в определении , если вы не сделаете что-то вроде получения их адреса, поэтому в большинстве случаев это не будет иметь любая стоимость в скомпилированном коде - компилятор просто подставляет значение всякий раз, когда видит имя константы.

2 голосов
/ 03 марта 2012

Обычный способ (например, std :: array в C ++ 11) заключается в следующем:

constexpr unsigned char i() const { return I; }
constexpr unsigned char f() const { return F; }

Если ваш компилятор не поддерживает constexpr, удалите его.

1 голос
/ 03 марта 2012

вы можете просто использовать параметры шаблона , например:

#include <iostream>

using namespace std;

template<unsigned char I, unsigned char F>
class FOO
{
public:
    void bar() {
        cout << "I is: "<<I<<endl;
    }
    char getI() {
        return I;
    }
};

using namespace std;
int main(){
    FOO<4,2> a;
    a.bar();
    cout << "getI:"<<a.getI()<<endl;
}

вам не нужна копия, как в вашем примере (i = I)

Кстати: полностью прописные имена, такие как FOO , обычно по соглашению резервируются для макросов препроцессора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...