gpt4 book ai didi

c++ - 偏特化非类型参数

转载 作者:行者123 更新时间:2023-11-30 03:43:31 26 4
gpt4 key购买 nike

我需要一些帮助。我是元编程的新手,所以我什至不知道去哪里寻找解决方案(到目前为止我认为这是不可能的)。

template<typename T, void(*FuncPtr_A)(int), int(*FuncPtr_B)() = nullptr>
class DummyClass
{ };

template<typename T, int(*FuncPtr_B)()>
class DummyClass<T, nullptr, FuncPtr_B>
{ };

void FUNC_A(int) { }
int FUNC_B() { return 0; }

int main()
{
DummyClass <int, FUNC_A, FUNC_B> test1; // works
DummyClass <int, FUNC_A> test2; // works
DummyClass <int, FUNC_B> test3; // error: is there any way to make this work?
return 0;
}

最佳答案

我能做的最好的是:

namespace detail {
template<typename T, void(*FuncPtr_A)(int), int(*FuncPtr_B)()>
class DummyClass
{ };
}

template<class T, void(*FuncPtr_A)(int)>
auto DummyClass()
{
return detail::DummyClass<T, FuncPtr_A, nullptr>();
}

template<class T, int(*FuncPtr_B)(void)>
auto DummyClass()
{
return detail::DummyClass<T, nullptr, FuncPtr_B>();
}

template<class T, void(*FuncPtr_A)(int), int(*FuncPtr_B)(void)>
auto DummyClass()
{
return detail::DummyClass<T, FuncPtr_A, FuncPtr_B>();
}




void FUNC_A(int) { }
int FUNC_B() { return 0; }

int main()
{
auto test1 = DummyClass <int, FUNC_A, FUNC_B>(); // works
auto test2 = DummyClass <int, FUNC_A> (); // works
auto test3 = DummyClass <int, FUNC_B> (); // works
return 0;
}

编辑:

如果您需要命名类型(例如用作类中的数据成员):

int main()
{
decltype(DummyClass <int, FUNC_A, FUNC_B>()) test1 {}; // works
decltype(DummyClass <int, FUNC_A> ()) test2 {}; // works
decltype(DummyClass <int, FUNC_B> ()) test3 {}; // works
return 0;
}

关于c++ - 偏特化非类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36029307/

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