【发布时间】:2019-11-29 10:07:07
【问题描述】:
考虑以下具有模板变量并使用模板别名和自动类型推导的非类模板。
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>()语法调用静态成员函数。无需声明非静态版本(只要您不想创建指向该函数的成员指针。) -
我什至不明白你在这里做什么。返回类型将是
Type<Type<int>>或Type<Type<double>>。这就是你想要的吗?如果你这样做了,那似乎很奇怪。 -
您使用的是哪个编译器?尝试编译时出现“模糊调用”类型错误。
-
C++ Static member method call on class instance 的可能重复项。或者可能不是,这取决于这种“相同类型的接口”的预期用途。
标签: c++ static overloading c++17 template-variables