gpt4 book ai didi

c++ - 在 C++ 中限制允许的模板参数是否被认为是不好的风格?

转载 作者:搜寻专家 更新时间:2023-10-31 02:11:26 24 4
gpt4 key购买 nike

将函数模板限制为仅接受模板参数的几个允许值是否被认为是不好的风格?

例子:

template<typename T>
class Foo {

typename std::enable_if<std::is_same<Bar, T>::value, void>::type
callFuncInBar() {
BarGetValue();
}


typename std::enable_if<std::is_same<FooBar, T>::value, void>::type
callFuncInFooBar() {
FooBarGetValue();
}

};

编辑:我的情况是这样的:我有两个简单的结构 A 和 B,它们几乎相似:

struct A: public ICompress {
void compress() override {
next->compress();
}

ICompress *next;
};

struct B: public IDecompress {
void decompress() override {
next->decompress()
}

IDecompress *next;
};

我的意图是创建一个模板,该模板应实例化为 Compressor 或 Decompressor:

template<typename T>
struct codecomp: public T {
typename std::enable_if<std::is_base_of<ICompress, T>::value, void>::type
compress() {
next->compress();
}

typename std::enable_if<std::is_base_of<IDecompress , T>::value, void>::type
decompress() {
next->decompress();
}

T *next;
};

最佳答案

如前所述,如果Foo,您的代码将无法编译。永远被实例化。对于任何类型 T这与 Bar 不同, Foo<T> 的实例化将导致 Foo<T>::callFuncInBar 返回类型的实例化,这将失败。同样,如果 TFooBar 不同然后实例化callFuncInFooBar的返回类型会失败。

我想这不是你想要的。

我假设您真正想要的是 Foo<T>::callFuncInBar仅在 T 时可调用是Bar .这通常由模板专门化处理:专门化类模板 Foo<T>对于 T = BarT = FooBar ,并且在主模板中,不要声明 callFuncInBarcallFuncInFooBar成员函数,因此它们将不可用。这完全避免了你的风格问题; Foo可以使用任何模板参数实例化,但具有依赖于特定参数的功能集。 (而且 that 在风格方面被认为是完美的;即使是标准库也是如此。)

关于c++ - 在 C++ 中限制允许的模板参数是否被认为是不好的风格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43557110/

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