在C++中只在常量限定符上实现模板
Achieve template only on const qualifier in C++
我想得到两个只在参数常量上不同的类。
我目前所做的是:
(这是一个伪最小示例。(
template <typename T>
struct Wrapper {
Wrapper(T & t):
t(t) {
}
T & t;
};
class Foo;
using Foo_wrapper = Wrapper<Foo>;
using Const_Foo_wrapper = Wrapper<const Foo>;
我希望我的模板在Foo上以独占方式声明,而仅在const限定符上不同
这可能会像:
(这是无效的语法,试图给出这个想法。(
class Foo;
template <qualifier Q>
struct Foo_base_wrapper {
Wrapper(Q Foo & t):
t(t) {
}
Q Foo & t;
};
using Foo_wrapper = Foo_base_wrapper<none>;
using Const_Foo_wrapper = Foo_base_wrapper<const>;
有办法做到这一点吗?
(一个接近的解决方案可能有概念,但它仍然更通用和复杂,而且我没有C++20。(
您不能单独使用const
关键字,但您可以使用模板(部分(专门化来控制类型的常量。
enum Qualifier { Mutable, Const };
template<typename T, Qualifier Q>
struct Qualified
{
using type = T;
};
template<typename T>
struct Qualified<T, Const>
{
using type = const T;
};
template <Qualifier Q = Mutable>
struct Foo_base_wrapper
{
using QualifiedFoo = typename Qualified<Foo, Q>::type;
Foo_base_wrapper(QualifiedFoo & t) : t(t)
{ }
QualifiedFoo & t;
};
using Foo_wrapper = Foo_base_wrapper<>; // or explicitly Foo_base_wrapper<Mutable>
using Const_Foo_wrapper = Foo_base_wrapper<Const>;
如果您不必定义其他包装器,那么您当然可以在Qualified模板及其专业化中直接使用Foo。
您可能还对处理引用常量的函数std::ref / std::cref
感兴趣。
相关文章:
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- std::random_device是如何实现的