gpt4 book ai didi

c++ - 模板非类型模板化引用参数

转载 作者:太空宇宙 更新时间:2023-11-04 13:53:51 26 4
gpt4 key购买 nike

我有一系列模板化类,我想在编译时相互了解。每个对象都可能具有其他编译时属性,这些属性将用于设置代码的运行时条件。

我理想的模式是这样的:

template <unsigned int A, unsigned int B>
class FirstClass
{
};

template < template<unsigned int A, unsigned int B> FirstClass &firstClass >
class SecondClass
{
};

//...

FirstClass<1,2> fc;
SecondClass<fc> sc;
ThirdClass<sc> tc;
//...

有办法吗?

如果我为 SecondClass 做这样的事情,我可以接近:

template < unsigned int A, unsigned int B, FirstClass<A,B> &firstClass >

但这需要我传递两个额外的参数(而不是让编译器推断它们)并且不会很好地扩展。

谢谢!

最佳答案

正确的问题是:您真的关心第二个模板的参数是否真的来自第一个模板,或者如果它的行为与第一个模板完全一样,您是否可以接受?

第二种情况,实在是没办法了。只需使用普通模板参数即可。

在第一种情况下,您始终可以将 static_assertis_same 一起使用。它要求第一个类型具有两个参数的常量:

template <unsigned int A, unsigned int B>
class FirstClass
{
public:
constexpr static unsigned int a = A;
constexpr static unsigned int b = B;
};

然后你可以这样做:

template <typename FC>
class SecondClass
{
static_assert(std::is_same<FC,FirstClass<FC::a, FC::b> >::value, "Wrong template argument for SecondClass");
};

如果你没有使用 C++11,看看 Boost 中的 static_assert 实现,它并没有那么复杂。而且您还必须自己实现 is_same,但我不知道这有多难。

并使用它:

FirstClass<1,2> fc;
SecondClass<decltype(fc)> sc;

请注意,您将永远被允许在模板参数中使用局部变量。

您可能想要查看的另一件事(仍然是 C++11)是辅助函数:

如果您将第二个类重写为:

template <unsigned int A, unsigned int B>
struct SecondClass
{
FirstClass<A,B> fc;

A(FirstClass<A,B> arg)
:fc(arg)
{ }
};

然后你可以这样写:

template <unsigned int A, unsigned int B>
SecondClass<A,B> secondClass(FirstClass<A,B> arg)
{
return SecondClass<A,B>(arg);
}

在你的功能中:

FirstClass<1,2> fc;
auto sc = secondClass(fc)

关于c++ - 模板非类型模板化引用参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22419053/

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