Вывод типа нетипичного параметра шаблона C ++ - PullRequest
9 голосов
/ 18 июля 2011

Я пытаюсь сделать эту работу:

template < typename T, T VALUE >
void            f()
{
    /* ... */
}

int             main()
{
    f<10>();    // implicit deduction of [ T = int ] ??
    return (0);
}

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

После многих поисков я не могу найти никакого способасделать это на C ++ 0x, так что stackoverflow - это мое последнее средство.

  • без указания всех возможных типов T ...
  • Я на g ++ C ++ 0x, поэтомусексуальные вещи разрешены.

Ответы [ 3 ]

5 голосов
/ 18 июля 2011

C ++ 0x вводит decltype(), что делает именно то, что вы хотите.

int main()
{
  f<decltype(10), 10>(); // will become f<int, 10>();
  return 0;
}
5 голосов
/ 18 июля 2011

В C ++ нет автоматического вывода шаблонов для структур / классов.Хотя вы можете сделать что-то вроде этого (предупреждение, не проверено!):

#define F(value) f<decltype(value), value>

template < typename T, T VALUE >
void            f()
{
    /* ... */
}

int             main()
{
    F(10)();
    return (0);
}

Это не так чисто, как шаблонный код, но понятно, что он делает, и позволяет избежать бремени повторения,Если вам нужно, чтобы он работал на компиляторах не-C ++ 0x, вы можете использовать Boost.Typeof вместо decltype.

2 голосов
/ 18 июля 2011

Я не думаю, что вы можете сделать это, вам просто нужно сообщить компилятору, что там есть тип.Самое близкое, что я могу придумать, это что-то вроде этого:

template <class T>
void f(T x) {
    // do something with x
}

f(10);

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

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