gpt4 book ai didi

c++ - C++ 模板能否确定正在声明/定义的实例是否为常量?

转载 作者:太空狗 更新时间:2023-10-29 20:26:05 27 4
gpt4 key购买 nike

对于给定的模板,例如 std::string,模板能否检测声明/定义的 string 实例是否为常量。 (注意:我不是在询问模板参数。)

std::string mutable_string("a string that may possibly be changed");

对比

const std::string immutable_string("a string that will not change);

如果可能的话,模板可以为提供给构造函数的字符串字面值分配准确的堆存储量。此外,可以省略非常量、非常量、非 ctor/dtor 方法的代码生成(除非某些翻译单元定义非常量字符串)。

我希望语义上类似于:

is_constant<std::string>(*this)::value

是否可以将实例的类型与去除了 const 限定符的类型进行比较?

更新/澄清:扩展std::string 示例,const std::string 的模板特化是否能够声明检查员作为 constexpr(例如 size()capacity()?

最佳答案

如果我没猜错:

#include <iostream>

template <typename T>
inline constexpr bool is_constant(T&) {
return false;
}

template <typename T>
inline constexpr bool is_constant(const T&) {
return true;
}

template <bool Value>
void print() {
std::cout << (Value ? "true " : "false ");
}

struct X {
void a() { print<is_constant(*this)>(); }
void b() const { print<is_constant(*this)>(); }
};

int main() {
X x;
// false
x.a();
// true
x.b();
std::cout << '\n';
return 0;
}

但是,如果您想检测一个对象是否为 const 限定,这是不可能的 - 构造函数永远不会是 const。

关于c++ - C++ 模板能否确定正在声明/定义的实例是否为常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21387163/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com