gpt4 book ai didi

c++ - 根据模板参数不同的基类

转载 作者:行者123 更新时间:2023-12-03 02:33:28 25 4
gpt4 key购买 nike

是否可以在编译时根据类模板的参数确定其确切基础?例如。我有一个类模板,它在其构造函数中接受一个参数,并且我想用另一个参数扩展该类,为此将使用另一个构造函数。问题在于,第二个实例化(具有两个参数)必须具有与具有一个参数的基类不同的基类。我可以使用 std::conditional 检测正确的基类,但问题在于一个类模板中同时存在两个构造函数。例如:

#include <type_traits>

struct X
{
};

struct Y
{
};

struct XX
{
};

struct XY
{
};


template<class T, class V = void>
struct Z: public std::conditional_t<std::is_void_v<V>, XX, XY>
{
Z(T&& t, V&& v)
: XY()
{
// do smth with t and v
}

Z(T&& t)
: XX()
{
// do smth with t
}
};

int main()
{
auto a = Z(X(), Y());
auto b = Z(X()); // <-- this instantiation fails
}

此处 Z(X(), Y()) 有效,但对于 Z(X()) 则失败并出现编译错误:

main.cpp: In instantiation of 'struct Z<X, void>':

main.cpp:39:19: required from here

main.cpp:23:5: error: forming reference to void

23 | Z(T&& t, V&& v)

| ^

更新:

尝试使用enable_if使两个参数构造函数成为模板,但它不起作用(与原始代码中相同的形成对void的引用):

    template<class = std::enable_if<! std::is_void_v<V>>>
Z(T&& t, V&& v)
: XY()
{
// do smth with t and v
}

最佳答案

这不是一个优雅的解决方案,但似乎可以 work ,使用偏特化和推导指南。

template<class T, class V>
struct Z: public XY
{
Z(T&& t, V&& v)
: XY()
{
// do smth with t and v
}
};

template<class T>
struct Z<T, void> : public XX
{
Z(T&& t)
: XX()
{

}
};

template <class T>
Z(T&& ) -> Z<T, void>;

关于c++ - 根据模板参数不同的基类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58238880/

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