Недавно я обсуждал со студентами возможности ограничения типов для шаблонов, использующих ссылки для переадресации. Я знал о сравнении типов по is_same
вместе с static_assert
или enable_if
, но мы также говорили о явном создании экземпляров шаблона.
Следующий пример работает для меня с GCC:
п.ч:
template <typename T>
void f(T&& param); // declaration
f.cpp:
#include <iostream>
template <typename T>
void f(T&& param) { std::cout << param << std::endl; }
// explicit instantiations:
template void f<int>(int&&);
template void f<int&>(int&);
main.cpp:
#include "f.h"
int main() {
f(1);
// f('1'); // LINKER ERROR
int i = 2;
f(i);
}
Я не эксперт в явных экземплярах шаблонов, поэтому мне просто интересно, является ли такое решение переносимым/совместимым со стандартами. (Пожалуйста, не спрашивайте меня о вариантах использования, у меня их нет. Для меня это чисто академический вопрос.)
ОБНОВЛЕНИЕ
Меня также немного смущает формат явного создания экземпляров (<int>(int&&)
и <int&>(int&)
), но я предполагаю, что он задается выводом шаблона и, возможно, правилами свертывания ссылок.