Можно ли эмулировать шаблон <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>();
}
Ответы
Ответ 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);