gpt4 book ai didi

c++ - 调用模板化类型的不同构造函数签名

转载 作者:行者123 更新时间:2023-11-30 03:22:21 25 4
gpt4 key购买 nike

我手头有一个模板繁重的代码,其中应该用作用户代码模板参数的类具有不同的构造函数签名。我的问题是,我还没有找到在我的用户代码中调用模板类的构造函数的好方法。一个最小的工作示例可能如下所示:

#include <string>
#include <iostream>
#include <memory>

class ShortConstructorInLibrary {
std::string myName;
static const int tag = 1;
public:
ShortConstructorInLibrary(std::string name) :
myName(name) {
}
};

class LongConstructorInLibrary {
private:

int a;
double b;
public:
static const int tag = 2;
LongConstructorInLibrary(int arg1, double arg2) :
a(arg1), b(arg2) {
}
};
//above is library code

template<typename T>
class MyClass {
std::shared_ptr<T> member_p;
//i want to call right constructor for both cases:
public:
MyClass() {

//how do i call the different constructors properly?!
member_p = std::shared_ptr<T>(new T("test"));
}

};

int main() {
MyClass<ShortConstructorInLibrary> obj; //works
//MyClass<LongConstructorInLibrary> obj2; // wrong constructor signature
}

这里我在一个库中有两个类,一个具有长而无关的构造函数签名,一个具有短的。我希望能够将它们都用作模板参数。在我的 userClass 中,我必须以某种方式定义要根据传递的类型传递给构造函数的参数。

我不能使用简单的 if(),因为编译器会检查两个签名,而其中一个是错误的。我不能将 c++17 用于“if constexpr(){}”。

我可以将模板参数“ShortConstructorInLibrary”传递给我的类并完美地调用它的构造函数,但是当我使用另一个类时,它当然会因错误的构造函数签名而失败。到目前为止,我使用了一个丑陋的技巧,我实现了两个辅助方法,我在其中传递一个指针,然后让这两个方法实现构造函数调用,但这对我来说似乎很丑陋。我也摆弄过 std::enable_if<> 但没走多远。 @Mohit 提议使用部分模板特化,但在现实世界的代码中, Short ConstructorInLibrary 类本身是用几个模板化的模板参数模板化的。给你一个想法:

‘class CFEM_LOP<Dune::PDELab::QkLocalFiniteElementMap<Dune::GridView<Dune::DefaultLeafGridViewTraits<const Dune::YaspGrid<2> > >, double, double, 1ul>, EngwHillenKnapp2014<MedicalDataManager<double, Dune::YaspGrid<2> >, Dune::YaspGrid<2> >, CFEM_L2OP<Dune::PDELab::QkLocalFiniteElementMap<Dune::GridView<Dune::DefaultLeafGridViewTraits<const Dune::YaspGrid<2> > >, double, double, 1ul> >, Dune::YaspGrid<2> >’

我觉得尝试专门化我的用户代码会一团糟。

实现签名可能不同的构造函数调用的正确方法是什么?

如有任何提示,我们将不胜感激!

(ubuntu 16.04, gcc)

最佳答案

尝试部分特化方法来实现这一点,我使用了 std::make_shared用于创建 std::shared_ptr

class ShortConstructorInLibrary
{
std::string myName;
static const int tag = 1;
public:
ShortConstructorInLibrary(std::string name) :
myName(name)
{
}
};

class LongConstructorInLibrary
{
private:

int a;
double b;
public:
static const int tag = 2;
LongConstructorInLibrary(int arg1, double arg2) :
a(arg1), b(arg2)
{
}
};
//above is library code

template<typename T>
class MyClass
{
std::shared_ptr<T> member_p;
//i want to call right constructor for both cases:
public:
MyClass()
{

//how do i call the different constructors properly?!
member_p = std::make_shared<T>("test");
}

};

template<>
MyClass<LongConstructorInLibrary>::MyClass()
{
member_p = std::make_shared<LongConstructorInLibrary>(0, 0.0); // pass you values.
}

int main()
{
MyClass<LongConstructorInLibrary> obj; //works
//MyClass<LongConstructorInLibrary> obj2; // wrong constructor signature
}

关于c++ - 调用模板化类型的不同构造函数签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51187061/

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