gpt4 book ai didi

c++ - 如果给定的模板参数提供类型定义,则使用 sfinae 启用构造函数

转载 作者:行者123 更新时间:2023-11-28 02:46:02 24 4
gpt4 key购买 nike

我想在模板类中启用两个构造函数中的一个,并且只启用一个,这取决于作为模板参数的给定类型是否定义了类型。

在这里,我想将给定模板中定义的类型作为附加参数添加到构造函数中,并在存在时转发此参数。但是请看:

class A
{ // this class did not provide ConstructorParms type definition
public:
A( int i) {}
};

class B
{ // this class provide the type ConstructorParms
public:
using ConstructorParms= double;

B( double d, int i) {}
};


template <typename T>
class Check: public T
{
public:
// ??? enable_if T has typename T::ConstructorParms
Check( typename T::ConstructorParms parms, int i): T( parms, i) {}

// ??? enable_if T has NOT typename T::ConstructorParms
Check( int i): T(i){}
};

int main()
{
Check<A> ca(9);
Check<B> cb(1.23, 10);
return 0;
}

我遇到了麻烦,因为构造函数“方法”本身没有模板参数。有什么想法吗?

注意(给定答案的原因):代码片段真的被简化了。使用 using 转发到父构造函数不是一个选项,因为现实世界类 Check 需要一些参数。这使得无法转发到父构造函数。

最佳答案

您可以使用 SFINAE 解决此问题,但自 C++11 以来有一个更简单的解决方案:继承构造函数。

template <typename T>
class Check: public T
{
public:
using T::T;
};

如果构造函数不仅仅做转发;使用这个通用解决方案:

#include <type_traits>

template< typename T >
struct HasCtorParamTypedef
{
template< typename U,
typename = typename U::ConstructorParms >
static int f( U );

static void f( ... );

static const bool value = std::is_same<decltype(f(std::declval<T>())), int>::value;
};

template <typename T>
struct Check: public T
{
// Is only enabled if T does have the typedef
template <typename U = T,
typename = typename std::enable_if<HasCtorParamTypedef<U>::value>::type >
Check( typename U::ConstructorParms parms, int i): T( parms, i) {}

// Is only enabled if T does **not** have the typedef
template <typename U = T,
typename = typename std::enable_if<!HasCtorParamTypedef<U>::value>::type >
Check( int i ): T(i){}
};

关于c++ - 如果给定的模板参数提供类型定义,则使用 sfinae 启用构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24411309/

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