Можно ли эмулировать шаблон? - PullRequest
17 голосов
/ 12 апреля 2011

Это как-то возможно?Я хочу, чтобы включить передачу аргументов во время компиляции.Предположим, что это только для удобства пользователя, так как можно всегда набирать реальный тип с помощью template<class T, T X>, но для некоторых типов, то есть функций указателя на член, это довольно утомительно, даже с decltype как ярлыком.Рассмотрим следующий код:

struct Foo{
  template<class T, T X>
  void bar(){
    // do something with X, compile-time passed
  }
};

struct Baz{
  void bang(){
  }
};

int main(){
  Foo f;
  f.bar<int,5>();
  f.bar<decltype(&Baz::bang),&Baz::bang>();
}

Можно ли как-то преобразовать его в следующее?

struct Foo{
  template<auto X>
  void bar(){
    // do something with X, compile-time passed
  }
};

struct Baz{
  void bang(){
  }
};

int main(){
  Foo f;
  f.bar<5>();
  f.bar<&Baz::bang>();
}

Ответы [ 3 ]

13 голосов
/ 12 апреля 2011

После вашего обновления: нет. В C ++ такой функциональности нет. Наиболее близким является макрос:

#define AUTO_ARG(x) decltype(x), x

f.bar<AUTO_ARG(5)>();
f.bar<AUTO_ARG(&Baz::bang)>();

Звучит так, как будто вы хотите генератор:

template <typename T>
struct foo
{
    foo(const T&) {} // do whatever
};

template <typename T>
foo<T> make_foo(const T& x)
{
    return foo<T>(x);
}

Теперь вместо произнесения:

foo<int>(5);

Вы можете сделать:

make_foo(5);

Чтобы вывести аргумент.

3 голосов
/ 18 ноября 2017

Добавлено в C ++ 17 Теперь вы можете написать

template<auto n> struct B { /* ... */ };
B<5> b1;   // OK: non-type template parameter type is int
B<'a'> b2; // OK: non-type template parameter type is char

См. http://en.cppreference.com/w/cpp/language/template_parameters, точка 4 из Нетипичный параметр шаблона section

1 голос
/ 12 апреля 2011

Это НЕ возможно. Единственный способ добиться этого - передать аргумент в функцию :

struct Foo{
  template<class T> void bar(T& X) {}
};

И затем вызвать функцию как,

f.bar(5);
f.bar(&Baz::bang);
...