gpt4 book ai didi

c++ - 如何编写一个可以决定调用哪个构造函数的模板?

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:28:20 24 4
gpt4 key购买 nike

我希望能够构造 A 或 B 而不必考虑构造函数参数的数量。

第二个构造函数不是合法的 C++,但我这样写是为了表达我想要的东西。

是否有 enable_if 技巧来选择性地启用其中一个构造函数?

(例如,取决于 A 和 B 的构造函数参数的数量。)

我需要用它来测试大约 15 个具有 1、2 或 3 个构造函数参数的类。

struct A
{
A(int x)
{
}
};

struct B
{
B(int x, int y)
{
}
};

template<typename T>
struct Adaptor // second constructor is illegal C++.
{
T t;

Adaptor(int x, int y)
: t(x)
{
}

Adaptor(int x, int y) // error: cannot be overloaded
: t(x, y)
{
}
};

int main()
{
Adaptor<A> a(1,2);
Adaptor<B> b(1,2);

return 0;
}

最佳答案

@Aaron 方法的变体:

#include <type_traits>
#include <utility>

enum EArity { EZero = 0, EOne, ETwo, EThree, Error };

template <typename T, typename A1, typename A2, typename A3> struct getArity
{
static const EArity arity =
std::is_constructible<T>::value ? EZero :
std::is_constructible<T, A1>::value ? EOne :
std::is_constructible<T, A1, A2>::value ? ETwo :
std::is_constructible<T, A1, A2, A3>::value ? EThree : Error;
};

template <typename T, EArity A> struct Construct;

template <typename T> struct Construct<T, EZero>
{
T t;

template <typename A1, typename A2, typename A3>
Construct(A1 && a1, A2 && a2, A3 && a3) : t() { }
};

template <typename T> struct Construct<T, EOne>
{
T t;

template <typename A1, typename A2, typename A3>
Construct(A1 && a1, A2 && a2, A3 && a3) : t(std::forward<A1>(a1)) { }
};

// ...

template <typename T>
struct AdapterIntIntInt : Construct<T, getArity<T, int, int, int>::arity>
{
Adapter(int a, int b, int c)
: Construct<T, getArity<T, int, int, int>::arity>(a, b, c) { }
};

template <typename T, typename A1, typename A2, typename A3>
struct Adapter : Construct<T, getArity<T, A1, A2, A3>::arity>
{
Adapter(A1 && a1, A2 && a2, A3 && a3)
: Construct<T, getArity<T, A1, A2, A3>::arity>
(std::forward<A1>(a1), std::forward<A2>(a2), std::forward<A3>(a3))
{ }
};

关于c++ - 如何编写一个可以决定调用哪个构造函数的模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8783232/

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