gpt4 book ai didi

c++ - 基于模板类型参数的条件成员签名及实现

转载 作者:搜寻专家 更新时间:2023-10-31 02:09:36 26 4
gpt4 key购买 nike

我正在尝试编写一个具有多个类型参数的模板类 T1T2 .该类有一个类型为 std::promise<T2> 的私有(private)成员.

template <class T, class T2>
class Test
{
public:
void setValue(T2 value)
{
promise.set_value(value);
}

void setValue()
{
promise.set_value();
}

private:
std::promise<T2> promise;
};

此类在 T2 时编译得很好绝不是 void(只要您不调用不带参数的 setValue。当 T2 为 void 时,我会收到编译器错误:

error C2182: 'value' : illegal use of type 'void'

T2绝不是无效的,我想使用第一个 setValue方法,它有一个类型为 T2 的参数.当T2无效,我想使用第二个 setValue方法,不带参数。我看过很多例子,但我对模板编程还比较陌生,而且我似乎无法让它发挥作用。

是否可以通过 std::enable_if 以某种方式完成此操作?或者使用模板特化?

最佳答案

辅助模板类特化:

#include <future>

template<typename T>
class TestHelper
{
public:
void setValue(T const& v)
{ promise.set_value(v); }

private:
std::promise<T> promise;
};

template<>
class TestHelper<void>
{
public:
void setValue()
{ promise.set_value(); }

private:
std::promise<void> promise;
};

template <class T, class T2>
class Test : public TestHelper<T2>
{
};

int main()
{
Test<void, int> t;
// t.setValue(); // compilation error: no matching function for call to 'std::promise<int>::set_value()'
t.setValue(0);

Test<void, void> t1;
t1.setValue();
// t1.setValue(0); // compilation error: no matching function for call to 'std::promise<void>::set_value(int)'
}

关于c++ - 基于模板类型参数的条件成员签名及实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46426100/

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