考虑以下具有模板变量并使用模板别名和自动类型推导的非类模板。
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,以便可以在没有任何参数的情况下调用它。如果不添加它,那么将无法重载没有参数或参数列表具有相同参数的静态和非静态成员函数。
这会被认为是快速修复还是黑客攻击,或者这是一种能够为具有相同名称和功能的静态和非静态成员函数提供相同类型接口的可能方式?
函数参数或参数是一个虚拟参数,对内部值绝对没有任何作用。
回来并再次阅读后,我可以看到一些混乱来自于我忽略了这更多地与变量模板的使用和能够访问它们有关的事实。
所以我认为真正的问题应该是:关于变量模板成员并且它们必须是静态的,通过成员函数访问它们的首选方式是什么:通过静态或非静态,或者没有偏好和选择留给程序员?
最后一件事;是否有任何不可预见的问题可能导致这种类型的设计模式 - 接口的未来后果?