gpt4 book ai didi

c++ - 模板类可选地插入初始值作为模板参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:02:06 26 4
gpt4 key购买 nike

我目前有一个类相当于:

template <class T>
class MyContainer
{
public:
MyContainer():
_value()
{
}

T DoSomething();

private:
T _value;
};

我想这样做,以便我可以将初始值作为模板参数输入,如下所示:

template <class T> constexpr T GetInital()
{
return 0;
}

template <> constexpr std::string GetInital()
{
return "";
}

template <class T, T initial = GetInital<T>()>
class MyContainer
{
public:
MyContainer():
_value(initial)
{
}

T DoSomething();

private:

T _value;
};

MyContainer<std::string> string_container; // initalized to ""
MyContainer<std::string, "hello"> string_container2; // initalized to hello
MyContainer<int> int_container; // initalized to 0
MyContainer<int, 43> int_container; // initalized to 43

但它不喜欢带有像 std::string 这样的“非平凡析构函数”的类。我正在尝试做的事情是可行的吗?有没有办法解决这个问题。

最佳答案

只需编写一个构造函数重载来进行初始化,这正是它的设计目的。

正如其他人所注意到的,模板参数的每种组合都会生成完全不同的类型。并且讨论一个可能的解决方案(编译时类型删除?)对于 C++ 的基本特性之一:构造函数所涵盖的情况毫无意义

template <class T>
class MyContainer
{
public:
MyContainer():
_value()
{
}

MyContainer(const T& init):
_value(init)
{
}

T DoSomething();

private:
T _value;
};

MyContainer<std::string> string_container; // initalized to ""
MyContainer<std::string> string_container2{"hello"}; // initalized to hello
MyContainer<int> int_container; // initalized to 0
MyContainer<int> int_container{43}; // initalized to 43

如果您想要一个typedef,其实例总是被初始化为您指定的值,只需编写一个工厂函数:

template<typename T> 
auto make_factory( const T& init )
{
return [=](){ return MyContainer<T>{ init }; };
}

int main()
{
auto factory = make_factory<std::string>( "hello" );

auto c1 = factory(); //c1 initialized to hello
auto c2 = factory(); //c2 initialized to hello
}

实际上,make_factory() 是工厂中的工厂...

关于c++ - 模板类可选地插入初始值作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26954840/

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