Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;std::在类模板中为成员函数启用__C++_Templates_C++11 - Fatal编程技术网

C++ C++;std::在类模板中为成员函数启用_

C++ C++;std::在类模板中为成员函数启用_,c++,templates,c++11,C++,Templates,C++11,问题很简单。我有一个带有include-guard的头文件和一个实现文件.impl。头文件包括实现文件。我想做以下工作: 头文件: template<size_t N> class A { void func(); }; 模板 甲级 { void func(); }; .impl文件: template<size_t N> typename std::enable_if<(N <= 5), void>::type A<N>::func

问题很简单。我有一个带有include-guard的头文件和一个实现文件.impl。头文件包括实现文件。我想做以下工作:

头文件:

template<size_t N>
class A
{
  void func();
};
模板
甲级
{
void func();
};
.impl文件:

template<size_t N>
typename std::enable_if<(N <= 5), void>::type A<N>::func() { ... }

template<size_t N>
typename std::enable_if<(N > 5), void>::type A<N>::func() { ... }
模板
typename std::enable_if::type A::func(){…}
但是,我对
std::enable_if
还不太熟悉,而且似乎找不到
func
的原型,因为我通过更改返回类型来更改函数签名。如何在为用户提供一个接口功能的同时实现不同的实现

这本质上是MCU寄存器修饰符,它在两个寄存器上运行,因为其中一个寄存器没有容量。我不希望在函数中使用任何基于N的脏偏移量,而是依赖于普通结构。此外,如果没有帮助函数,我也不希望使用会使事情复杂化的帮助函数。

您可以委托:

#include <iostream>

template<std::size_t N>
class A
{
    private:
    template <std::size_t I>
    typename std::enable_if<(I <= 5)>::type
    f() { std::cout << "Small\n"; }

    template <std::size_t I>
    typename std::enable_if<(I > 5)>::type
    f() { std::cout << "Big\n"; }

    public:
    void func() { f<N>(); }
};

int main()
{
    A<1> small;
    small.func();
    A<10> big;
    big.func();
}
#包括
样板
甲级
{
私人:
样板
typename std::如果您可以委托,则启用:

#include <iostream>

template<std::size_t N>
class A
{
    private:
    template <std::size_t I>
    typename std::enable_if<(I <= 5)>::type
    f() { std::cout << "Small\n"; }

    template <std::size_t I>
    typename std::enable_if<(I > 5)>::type
    f() { std::cout << "Big\n"; }

    public:
    void func() { f<N>(); }
};

int main()
{
    A<1> small;
    small.func();
    A<10> big;
    big.func();
}
#包括
样板
甲级
{
私人:
样板
typename std::enable_如果您可以改用:

模板
甲级
{
void func()
{
do_func(std::积分_常数5)>{});
}
void do_func(std::true_type){/*处理N>5的大小写*/}
void do_func(std::false_type){/*处理您可以使用的N:

模板
甲级
{
void func()
{
do_func(std::积分_常数5)>{});
}
void do_func(std::true_type){/*处理N>5的大小写*/}

void do_func(std::false_type){/*处理基本上试图部分专门化“函数模板”(类模板的成员函数)的N。这是不允许的。您可以部分专门化类模板或使用标记分派。您基本上试图部分专门化“函数模板”(类模板的成员函数)这是不允许的。你可以部分地专门化类模板或使用标签调度。我认为这不能为类做。编译失败多个错误,一个不能超载F……与其他F……现在是我工作了。当我投票时,我将把它标记为答案,这感觉更像C++方式,并给出了更多的控制。OLE是一个更好的方法。仅当需要时才使用UsSfIAE。读取一些C++迭代器库代码…@ yAKK。如何使用标签调度,有3个doyFunc函数,一个5和15无效。使用标签调度,我似乎需要引入新的类型来分类。@ ErthION菊花链(代码)我认为这不能为类做。编译失败多个错误,一个说不能超载F……与其他f……啊,是的,现在我得到它的工作。当投票同时,我会标记这是答案,这感觉更像C++的方式,并给予更多的控制比真/假。当需要的时候,阅读一些C++迭代器库代码…@ yakk,如何使用标签调度,有3个doyFunc函数,一个5和15是无效的?使用标签调度,我似乎需要引入新的类型来分类。
template <size_t N>
class A
{
    void func()
    {
        do_func(std::integral_constant<bool, (N > 5)>{});
    }

    void do_func(std::true_type) { /* handles the N > 5 case */ }
    void do_func(std::false_type) { /* handles the N <= 5 case */ }
};