繁体   English   中英

基于整数常量比较的模板特化

[英]Template specialization based on integer constant comparison

这是我有的东西:

template <typename T, std::size_t dim>
struct vector;

template <std::size_t dim>
struct vector<float, dim>
{
    // I want this implementation for dim <= 4
}

template <std::size_t dim>
struct vector<float, dim>
{
    // I want this implementation for dim > 4
}

int main() {
    vector<float, 3> v1; // should instantiate first one
    vector<float, 7> v2; // should instantiate second one
}

现在,这当然不是一个有效的例子,因为我无法让它发挥作用。 我不知道如何安排专业化模板签名。 它们现在是相同的模板参数,不会编译。 不知何故,一种SFINAE应该进入我想的图片但我不允许在部分特化上有默认的模板参数。

我可以使用constexpr if来处理代码选择并改为使用一个特化。 但我相信,对这些进行单独的专业化会使事情更具可读性和可管理性。

你会如何实现这一目标?

您可以使用SFINAE实现此目的。 您将一个额外的模板参数添加到非专业化模板,然后确保在特定条件的专业化中匹配它。

template <typename T, std::size_t dim, typename = void>
struct vector;

template <std::size_t dim>
struct vector<float, dim, std::enable_if_t<(dim <= 4)>>
{
    // I want this implementation for dim <= 4
};

template <std::size_t dim>
struct vector<float, dim, std::enable_if_t<(dim > 4)>>
{
    // I want this implementation for dim > 4
};

int main() {
    vector<float, 3> v1; // should instantiate first one
    vector<float, 7> v2; // should instantiate second one
}

如果传递给它的条件为真,则std::enable_if_t将默认推导为void 如果没有,它将不会导致导致替换失败的任何事情,从而使任何其他模板匹配。

std::enable_if_t需要c++14但是你可以使用typename std::enable_if<condition>::type c++11

使用附加层的可能解决方案 我们对此arg使用额外的bool模板参数和特化。 可用于低于С++ 11的版本。

template <typename T, std::size_t dim, bool moreThanFour>
struct vectorImpl;

template <std::size_t dim>
struct vectorImpl<float, dim, false>
{
   // I want this implementation for dim <= 4
};

template <std::size_t dim>
struct vectorImpl<float, dim, true>
{
   // I want this implementation for dim > 4
};

template <typename T, std::size_t dim>
struct vector : public vectorImpl < T, dim, (dim > 4) > {};

int main() {
   vector<float, 3> v1; // should instantiate first one
   vector<float, 7> v2; // should instantiate second one
}

使用概念,您可以简单地写:

template <typename T, std::size_t dim>
struct vector;

template <std::size_t dim>
    requires (dim <= 4)
struct vector<float, dim>
{
    // I want this implementation for dim <= 4
};

template <std::size_t dim>
    requires (dim > 4)
struct vector<float, dim>
{
    // I want this implementation for dim > 4
};

godbolt看到它

我们只需要等待它们

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM