我对部分模板特化有点困惑...我有一些代码依赖于算术数据类型 T 和小整数 DIM。我希望能够为不同的 DIM 值指定不同的类方法。使用部分模板特化的不可能让我探索 enable_if。这正是我所需要的……除了我希望它返回一个数字而不是一个类型。我怎样才能做到这一点?下面的代码应该说明我想要什么。
#include <stdio.h>
#include <iostream>
#include <type_traits>
template <typename T, int DIM>
class foo{
public:
T function();
};
template <typename T, int DIM>
T foo<T, std::enable_if<DIM == 1>::value>::function(){
// do something
return 1.0;
}
template <typename T, int DIM>
T foo<T, std::enable_if<DIM == 2>::value>::function(){
// do something else
return 2342.0;
}
int main(){
foo<int, 1> object;
int ak = object.function();
std::cout << ak << "\n";
return 0;
}
最佳答案
你完全可以用 enable_if
做你想做的,只要记住,当条件为假时替换必须失败,所以你必须调用 type
来确保替换专门针对各种条件时失败。
#include <stdio.h>
#include <iostream>
#include <type_traits>
template <typename T, int DIM>
class foo
{
public:
template <int D = DIM>
typename std::enable_if<D == 1, T>::type
function()
{
// do something
return 1.0;
}
template <int D = DIM>
typename std::enable_if<D == 2, T>::type
function()
{
// do something else
return 2342.0;
}
};
int main(){
foo<int, 1> object;
int ak = object.function();
std::cout << ak << "\n";
return 0;
}
对于简单的场景,如上面的场景(检查特定值,而不是一系列值),您还可以使用偏特化。但是,如果您想专门针对 1-50
中的所有值,另一个针对 51-200
,然后是通用 fallthrough,enable_if
效果很好。
您还可以在模板签名中使用enable_if
。只是一个简单的例子。
#include <stdio.h>
#include <iostream>
#include <type_traits>
template <typename T, int DIM>
class foo
{
public:
template <int D = DIM, typename std::enable_if<D == 1, void>::type* = nullptr>
T function()
{
// do something
return 1.0;
}
template <int D = DIM, typename std::enable_if<D == 2, void>::type* = nullptr>
T function()
{
// do something else
return 2342.0;
}
};
int main(){
foo<int, 1> object;
int ak = object.function();
std::cout << ak << "\n";
return 0;
}
关于用于非类型模板参数的 c++ enable_if,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47879234/