在C++中只在常量限定符上实现模板

Achieve template only on const qualifier in C++

本文关键字:实现 C++ 常量      更新时间:2023-10-16

我想得到两个只在参数常量上不同的类。

我目前所做的是:
(这是一个伪最小示例。(

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感兴趣。