gpt4 book ai didi

c++ - 带有类型参数的模板模板参数?

转载 作者:行者123 更新时间:2023-11-30 02:19:22 28 4
gpt4 key购买 nike

以下代码无法编译。 甚至可以传递 Configuration<t, u> 的实例吗?作为模板参数? (从常量表达式的优化中获利)

应用程序接口(interface):

template <int t, bool u>
struct Configuration {
static constexpr int commonValue = t;
static constexpr bool debug = u;
};

template <
template<int t, bool u> Configuration<t, u> &conf,
int x
>
class A {
public:
int doSomething() {
if (conf.debug) { // Optimize away if false
// ...
}
return x * conf.commonValue; // Optimize to e.g. 6 with `conf.commonValue` =
// 3, `x` = 2
}
};

API 的用户应该能够:

int main() {
static constexpr Configuration<3, false> conf;
A<conf, 2> a;
A<conf, 5> b;
A<conf, 8> c;
std::cout << a.doSomething() << std::endl; // 6 (evaluated at compile time!)
std::cout << b.doSomething() << std::endl; // 15
std::cout << c.doSomething() << std::endl; // 24
}

最佳答案

由于 Configuration 的属性是static , 你应该使用模板类型参数1:

template <class ConfT, int x>
class A {
public:
int doSomething() {
if (ConfT::debug) { // Optimize away if false

}
return x * ConfT::commonValue;
}
};

然后:

// Alias (not required):
using conf = Configuration<3, false>;

A<conf, 2> a;
A<conf, 3> b;

如果你想要非静态成员,我认为在 C++17 之前这是不可行的(不将 Configuration 的模板参数传递给 A ),但在 C++17 中你可以这样做<支持>1:

template <auto const& conf, int x>
class A {
public:
int doSomething() {
if (conf.debug) { // Optimize away if false
}
return x * conf.commonValue;
}
};

但请注意,您只能传递对具有静态存储持续时间的变量的引用。

1 在第一种情况下,您可以将类型限制为 Configuration<...>通过特化A , 在第二种情况下,您可以限制 conf 的类型使用额外的模板参数 std::enable_if .


您还应该使属性 constexprConfiguration ,不只是 const :

template <int t, bool u>
struct Configuration {
static constexpr int commonValue = t;
static constexpr bool debug = u;
};

关于c++ - 带有类型参数的模板模板参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50840097/

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