c++ - 使用依赖于模板参数的参数编写模板类的构造函数

标签 c++ templates constructor template-meta-programming

考虑以下两个具有接受截然不同的参数集的构造函数的类。

class A {
public:
  A(int x, double y) {
    //do something
  }
};

class B {
public:
  B(const std::vector<bool>& x) {
    //do something
  }
};

现在,我想编写一个类模板 TpC,它将有一个对象(可能是 A 或 B 或其他对象)。换句话说,我希望能够使用以下内容:

int x;
double y;
std::vector<bool> z;
TpC<A> obj_a (x, y);
TpC<B> obj_b (z);

如何为 TpC 编写依赖于 A 和 B 构造函数参数的构造函数?编写类似特征/策略的内容来告诉 TpC 每个特定特化的参数应该是什么是可以接受的。

最佳答案

您可以使用 parameter pack 编写模板构造函数对于 TpC。 (正如评论所建议的那样,我使用 SFINAE 来约束模板,否则它可能比复制构造函数更好地匹配。从我发布的链接中查看整个代码片段。)

template <typename T, typename... U>
struct my_is_same {
    constexpr static bool value = false;
};
template <typename T1, typename T2, typename... U>
struct my_is_same<T1, T2, U...> {
    constexpr static bool value = std::is_same_v<T1, std::remove_cvref_t<T2>>;
};
template <typename T, typename... U>
inline constexpr bool my_is_same_v = my_is_same<T, U...>::value;

template <typename T>
class TpC {
    T t;
public:
    template <typename... Args, typename = std::enable_if_t<
                                             !my_is_same_v<TpC, Args...> &&
                                             std::is_constructible_v<T, Args&&...>
                                           >>
    TpC(Args&& ... args) : t(std::forward<Args>(args)...) {}
};

然后

int x;
double y;
std::vector<bool> z;
TpC<A> obj_a (x, y);
TpC<B> obj_b (z);

LIVE

关于c++ - 使用依赖于模板参数的参数编写模板类的构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50492960/

相关文章:

c++ - Qt:获取标准光标像素图

c++ - C++ 中的 TCHAR* 到 char* 转换

c++ - 使用 cmake 有条件地生成源输入文件

c++ - 一组类型的模板特化

c++ - std::cout 是否保证被初始化?

c++ - 编写编程语言解析器的最佳实践

c++ - 为什么模板只能在头文件中实现?

templates - Twig:否定包含运算符 IN

java - 构造函数是 OOP 的哪一部分?

java - 在 Java 中不鼓励传递对对象的引用吗?