【问题标题】:Pointer to class with only static methods [closed]指向仅具有静态方法的类的指针[关闭]
【发布时间】: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&lt;T&gt;.

标签: c++ static-methods allocator


【解决方案1】:

你不能得到一个类型的指针(例如&amp;int),只能指向一个类型的对象。所以要么创建一个对象并返回一个指向它的指针,要么直接通过类型使用静态函数:

custom::vector&lt;int&gt;::alloc::allocate(5).

【讨论】:

  • 这确实提供了相同的功能,所以谢谢!注意:此解决方案需要用于 alloc 的 typedef。我刚刚使用了typedef alloc allocator,随后使用了custom::vector&lt;int&gt;::allocator::allocate(5)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 2023-04-04
  • 2011-11-21
相关资源
最近更新 更多