Рассмотрим следующий неклассовый шаблон, который имеет переменную шаблона и использует псевдоним шаблона и автоматический вывод типа.
template<typename T>
using Type = T;
using TypeA = Type<int>;
using TypeB = Type<double>;
class Foo {
private:
template<typename T>
static Type<T> type_;
public:
template<typename T>
explicit Foo( Type<T> type ) { type_<T> = type; }
// non static member
template<typename T>
auto bar() { return type_<T>; }
// static member
template<typename T>
static auto bar(T _x_ = 0) { return type_<T>; }
};
И программа, которая его использует:
// has to be defined in some cpp file.
template<typename T>
Type<T> Foo::type_;
int main() {
TypeA a{ 7 };
TypeB b{ 3.41 };
Foo f1( a );
Foo f2( b );
auto x = Foo::bar<TypeA>();
auto y = Foo::bar<TypeB>();
std::cout << "static auto f1: " << x << '\n';
std::cout << "static auto f2: " << y << '\n';
std::cout << "member f1: " << f1.bar<TypeA>() << '\n';
std::cout << "member f2: " << f2.bar<TypeB>() << '\n';
return 0;
};
Вывод
static auto f1: 7
static auto f2: 3.41
member f1: 7
member f2: 3.41
В объявлении класса; Я использую параметр T
в статической версии и устанавливаю его по умолчанию равным 0, чтобы его можно было вызывать без каких-либо параметров. Если это не добавить, то нельзя будет перегрузить статическую и нестатическую функцию-член, у которой нет аргументов или одинаковые аргументы для списка параметров.
Будет ли это считаться быстрым исправлением или взломом, или это возможный способ предоставить один и тот же тип интерфейса как для статической, так и для нестатической функции-члена с тем же именем и функциональностью?
Аргумент или параметр функции является фиктивным аргументом, который абсолютно ничего не делает с внутренним значением.
Вернувшись и прочитав это снова, я вижу, откуда исходила некоторая путаница, и я упустил факты, что это больше относится к использованию шаблонов переменных и возможности доступа к ним.
Поэтому я думаю, что настоящий вопрос должен был быть следующим: что касается переменных членов шаблона и того, что они должны быть статическими, каков предпочтительный способ доступа к ним через функцию-член: через статический или нестатический, или нет предпочтения и этого выбора остается на усмотрение программиста?
Еще одна последняя вещь; есть ли какие-либо непредвиденные проблемы, которые могут привести к будущим последствиям с этим типом шаблона проектирования - интерфейсом?
f1.bar<TypeA>()
. Нет необходимости объявлять нестатическую версию (если вы не хотите создавать указатель на член функции). - person cpplearner   schedule 21.07.2019Type<Type<int>>
илиType<Type<double>>
. Этого ты вообще хочешь? Если да, то это кажется очень странным. - person Omnifarious   schedule 21.07.2019T _x_ = 0
в объявлении функции абсолютно ничего не делает с внутренними значениями. Это просто фиктивный аргумент. - person Francis Cugler   schedule 21.07.2019Variable Templates
иTemplate Aliasing
, поскольку я никогда их не использовал, так что это был тренировочный код, чтобы понять правильный синтаксис и их использование. Я просто ищу угловые случаи, ловушки и т. Д. - person Francis Cugler   schedule 21.07.2019static
также бытьstatic
. В этом случае дубликат, вероятно, Преимущество использования статической функции-члена вместо эквивалентной нестатической функции-члена? - person JaMiT   schedule 22.07.2019