【发布时间】:2020-10-18 15:29:01
【问题描述】:
有没有办法获得指向只包含静态方法的类的指针?没有成员变量。
我有一个使用typename alloc = allocator<T> 作为模板参数之一的向量类。 allocator<T> 模板类纯粹由静态方法组成。我打算实现一个get_allocator 方法,该方法提供对给定向量分配器方法的访问。例如。这样就可以了:
int main() {
custom::vector<int> my_vector(10); // custom int-vector of initial size and capacity 10
// use my_vector's allocator<int> instead of new (don't ask why)
int* my_array = my_vector.get_allocator()->allocate(5);
// ^^ rhs should produce same result as new int[5]. allocator<T>::allocate uses ::operator new.
}
在custom::vector里面我有这个方法:
alloc* get_allocator() {
return &alloc
}
这会引发 MSVC 编译器错误 2275: 'alloc': 非法将此类型用作表达式
在签名前加前缀typename 没有帮助。
分配器类如下所示:
template <typename T>
class allocator : public mem_core::base_allocator<T> {
public:
using value_type = T;
using T_ptr = T*;
using T_ref = T&;
static T_ptr address(T_ref value) noexcept {
return mem_core::addressof<T>(value);
}
static void deallocate(T_ptr const ptr, const size_t& count) {
mem_core::deallocate<T>(ptr, count);
}
static T_ptr allocate(const size_t& amount) {
return mem_core::allocate<T>(amount);
}
private:
allocator() = default;
};
【问题讨论】:
-
这样做的具体目标是什么?你想在实践中如何使用这样的指针?我很确定,您正在尝试解决一个 XY 问题。
-
我想指出,如果你正在为
std::vector实现一个drop in,那么你应该知道get_allocator意味着返回一个allocator_type值。所以,如果你符合要求,你的“无中生有”问题就会消失。 -
不能取类型的地址。类型不存在。
-
目标是使
generic_vector.get_allocator()其中generic_vector的类型为T等于简单地编写custom::allocator<T>.
标签: c++ static-methods allocator