meg*_*uli 2 c++ templates sfinae
这是我有的东西:
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
}
Run Code Online (Sandbox Code Playgroud)
目前,这当然不是可行的示例,因为我无法使其正常工作。我不知道如何安排专业模板签名。它们现在是相同的模板参数,将不会编译。不知何故,某种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
}
Run Code Online (Sandbox Code Playgroud)
std::enable_if_tvoid如果传递给它的条件为true,则默认情况下将推断为。如果不是这样,它将不会导致导致替换失败的任何事情,从而导致其他模板无法匹配。
std::enable_if_t需要c++14但你可以使用typename std::enable_if<condition>::type自c++11。
| 归档时间: |
|
| 查看次数: |
90 次 |
| 最近记录: |