Подтвердить что ты не робот

Можно ли эмулировать шаблон <auto X>?

Как это возможно? Я хочу, чтобы включить передачу аргументов во время компиляции. Предположим, что это только для удобства пользователя, так как всегда можно вывести реальный тип с помощью 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>();
}
4b9b3361

Ответ 1

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

#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);

Вывести аргумент.

Ответ 2

Он был добавлен в С++ 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 из Параметр непигового шаблона

Ответ 3

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

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

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

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