用于非类型模板参数的 c++ enable_if

标签 c++ templates template-specialization enable-if non-type

我对部分模板特化有点困惑...我有一些代码依赖于算术数据类型 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/

相关文章:

c++ - 如何保证 C++ 模板类特化之间的接口(interface)一致?

c++ - 为什么我的#includes 的顺序很重要? (C++)

c++ - 非模板类中的某些模板函数

c++ - 类模板状态数据成员,而不是可以显式特化的实体

c++ - 基于整体类模板专门化一个类方法

c++ - 仅类型推导模板

c++ - 如何有效地计算给定数字的所有不同组合的按位异或值之和?

c++ - 在类之间共享对象的好方法是什么?

c# - 将 const char* 字符串从非托管传递到托管

c++ - boost::any 和模板