相关疑难解决方法(0)

std::enable_if 的第二个参数有什么用?

我对 std::enable_if 的第二个参数感到困惑。在使用 int 返回类型时,我们可以使用:

template <class T>
typename std::enable_if<mpi::is_builtin<T>::value, int>::type
foo() { return 1; }
Run Code Online (Sandbox Code Playgroud)

但是如何在参数或模板中使用enable_if?在这种情况下,下面的too函数有什么区别:

template<class T , 
       class = typename std::enable_if<std::is_integral<T>::value>::type >
T too(T t) { std::cout << "here" << std::endl; return t; }

int too(int t) { std::cout << "there" << std::endl; return t; }
Run Code Online (Sandbox Code Playgroud)

谢谢。

c++ generics templates enable-if c++11

5
推荐指数
1
解决办法
1429
查看次数

std :: numeric_limits作为条件

有没有办法可以使用std::numeric_limits<T>::is_integerstd::numeric_limits<T>::is_specialized更改模板行为?

例如,我可以这样做:

template < typename T >
void foo( const T& bar )
{
    if( std::numeric_limits< T >::is_integer )
    {
        isInt( bar );
    }
    else if( std::numeric_limits< T >::is_specialized )
    {
        isFloat( bar );
    }
    else
    {
        isString( bar );
    }
}
Run Code Online (Sandbox Code Playgroud)

c++ templates numeric-limits c++11

1
推荐指数
1
解决办法
679
查看次数

更改类型而不更改位

我想把一个堆栈变量和reinterpret cast它变成一个大小相同的无符号整数类型.例如,我可能想要获取double值并将其转换为a uint64_t,并且不会修改位.我想以通用的方式做到这一点.

如果我正在处理指针,我会使用reinterpret_cast<uint64_t*>(double_ptr).

我提出了一个解决方案,它使用了一个肮脏的黑客reinterpret_cast,并且是有效的,但它需要相当多的元编程来获得一个相当简单的结果.

问题是:有更好的方法吗?我确信有,并且我正在使这比需要更复杂.

我确实考虑过使用类型T和尺寸合适的模板化联合int_t,但这看起来甚至更黑,并且似乎与未定义的行为一起玩.

编辑我理解标准没有指定double应该是64位,如注释中所指出的那样.但是使用通用方法,我将能够获得与double相同大小的无符号整数类型,无论大小如此.

#include <iostream>

template <typename T, std::size_t S>
struct helper {};

template <typename T>
struct helper<T, 1> {
    using type = uint8_t;
};
template <typename T>
struct helper<T, 2> {
    using type = uint16_t;
};
template <typename T>
struct helper<T, 4> {
    using type = uint32_t;
};
template <typename T>
struct helper<T, 8> {
    using type = uint64_t; …
Run Code Online (Sandbox Code Playgroud)

c++ types casting c++11

1
推荐指数
1
解决办法
326
查看次数

std :: enable_if <>的错误

我试图在C++中使用基本的SFINAE模式和STL,std::enable_if<>并在第一个障碍时失败:

#include <type_traits>

template< typename T >
typename std::enable_if< true, bool >::type    // compiles fine
//std::enable_if< false, bool >::type // lots of errors
myFunction( T val )
{
    // do stuff
    return true;
}

void main()
{
    int i = 0;
    myFunction( i );
}
Run Code Online (Sandbox Code Playgroud)

在第一种情况下,enable_if<true,bool>只是按预期工作.在第二种情况下,enable_if<false,bool>我希望编译失败只有一个错误,'myFunction': identifier not found但我得到多个错误'type' : is not a member of 'std::enable_if<false,bool>',然后从那里传播更多的错误.

一方面,编译器确实给出了错误,但另一方面,我认为重点是替换失败不是错误?我错过了一个非常明显的观点吗?或者VC 2013有SFINAE问题吗?

谢谢

c++ stl visual-c++ c++11 visual-studio-2013

1
推荐指数
1
解决办法
275
查看次数

基于std :: is_convertible的std :: enable_if无法正确推断模板

我有以下代码:

#include <iostream>
#include <type_traits>

template <typename T, typename std::enable_if
                                 <std::is_convertible<int, T>::value, T>::type>
void func(T a)
{
    std::cout << a << std::endl;
}

template <typename T, typename std::enable_if
                                 <!std::is_convertible<int, T>::value, T>::type>
void func(T a)
{
    a.print();
}

class Test
{
public:
    void print()
    {
        std::cout << "Test" << std::endl;
    }
};    

int main()
{
    func(3);
    func("Test");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用此代码,我希望第一个调用func打印输出3int实际上可以转换为int,应该调用第一个专业化名称),第二个调用func打印输出TestTest()不能转换为int,所以应该调用第二个专业化名称)。但是,我得到了一个编译器错误:

prog.cpp:在函数'int main()'中:

prog.cpp:27:8:错误:没有匹配的函数调用'func(int)'

prog.cpp:5:6:注意:候选:模板[类T,类型名称std …

c++ enable-if

1
推荐指数
1
解决办法
1087
查看次数