gpt4 book ai didi

c++ - 为某些模板参数设置模板函数的公共(public)/私有(private)

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

是否可以使某个模板函数对某些模板参数具有 2 个可访问性级别? (通过拆分成 2 个函数?)

class B{
enum ENU{
T0,T1,T2
}
template<ENU T=T0> someType f(){ ... } //want T1,T2 = public, T0 = private
};

当前用法(解决方案不应更改它):-

B b;
int aa=b.f<T0>(); //should fail
std::string bb=b.f<T1>();// should ok

编辑:B有很多这样的函数。



这是完整的代码(以防万一有人想编辑或使用)https://ideone.com/ryNCml .

最佳答案

我怀疑您尝试做的事情是否可行,因为在 C++ 中不允许对值进行特殊化处理。

虽然如果你不需要枚举,你可以写类似的东西:

class B {
public:
struct T0{};
struct T1{};
struct T2{};
template<typename T> void f(T, ...) {
static_assert(std::is_same_v<T, T1> || std::is_same_v<T, T2>);
}
private:
void f(T0, ...) {}
};

int main(int argc, char **argv) {
B b{};
b.f(T1{}); // Should compile
b.f(T0{}); // Should not compile
}

如果您要使用相同的函数实现,您可以将其转发给一个通用方法,或者简单地将 T0 设为私有(private)。

或者,您可以使用可以转换值的代理对象,但我不确定这是否是我熟悉的编译器扩展的标准 C++:

class B {
public:
enum class T { //< Strong typed!
T0,
T1,
T2
}
template <T t>
struct TWrapper {};

template <T ActualT>
void f(..., TWrapper<ActualT> tw = TWrapper<ActualT>{});
private:
template <>
struct TWrapper<T0> {};
}

关于c++ - 为某些模板参数设置模板函数的公共(public)/私有(private),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39179742/

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