gpt4 book ai didi

c++ - SFINAE - 用一个参数检测构造函数

转载 作者:行者123 更新时间:2023-11-30 04:18:52 25 4
gpt4 key购买 nike

有谁知道如何检测只有一个参数的构造函数?例如,这个结构应该有一个否定的结果:

struct MyStruct
{
MyStruct( int x, int x2 ) : y( x ) {}
int y;
};

我这里有一个很好的 SFINAE 检查,以查看类或结构是否作为具有特定数量参数的构造函数。这是参数数为 3 的那个:

template <typename T>
struct HasCtor3Args
{
struct Any { template <typename U> operator U( void ); };

template <typename U>
static int32 SFINAE( decltype( U( Any( ), Any( ), Any( ) ) ) * );

template <typename U>
static int8 SFINAE( ... );

static const bool value = sizeof( SFINAE<T>( NULL ) ) == sizeof( int32 );
};

这似乎工作得很好,因为 Any 结构可以转换为参数应该是的任何类型。然而,问题在于尝试检测只有一个参数的构造函数时。由于将 Any 默认为与 T 相同的类型,因此 SFINAE 检查似乎总是返回 true,从而检测到复制构造函数。

编辑和更新:我做了几次尝试,似乎都没有成功……这是我能得到的最接近的结果,但没有用,因为它总是返回 true。这个想法是尝试让复制构造函数解析而不是第一个“捕获所有”调用:

template <typename T>
struct HasCtor1Args
{
struct Any
{
template <typename U>
operator U( ) const;
};

template <typename U>
static int32 SFINAE( decltype( U( Any( ) ) ) * );

// Try to catch the copy ctor here
T MakeT( void );
template <typename U>
static int8 SFINAE( decltype( U( MakeT( ) ) ) * );

template <typename U>
static int8 SFINAE( ... );

static const bool value = sizeof( SFINAE<T>( NULL ) ) == sizeof( int32 );
};

我还尝试使用 explicit 关键字以及 C++11 的 = delete 功能,然后意识到我需要使用的编译器(Microsoft 的)不允许这样做。我还尝试在转换类型 U 上使用 std::enable_if,尽管我遇到了不能默认函数模板参数的错误。

最佳答案

虽然 n.m. 的批评仍然存在,但这里有一个版本可以检测具有只有一个 1 参数非复制、非移动构造函数的类型。它使用 SFINAE 来限制 Any 的转换。

注意:带有默认参数的其他 ctors 会导致歧义(例如 my_type(int, double=0);。这是一个非常有限的解决方案。

#include <cstdint>
#include <type_traits>

template <typename T>
struct HasCtor1Args
{
struct Any
{
template
<
typename U, typename SFINAE =
typename std::enable_if< false == std::is_same<U,T>::value, U >::type
>
operator U() const;
};

template <typename U>
static int32_t SFINAE( decltype( U( Any( ) ) ) * );

template <typename U>
static int8_t SFINAE( ... );

static const bool value = sizeof( SFINAE<T>( nullptr ) ) == sizeof( int32_t );
};


struct my_type
{
my_type(int);
my_type(my_type const&);
};

int main()
{
static_assert(HasCtor1Args<my_type> :: value, "epic fail");
}

关于c++ - SFINAE - 用一个参数检测构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16137468/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com