gpt4 book ai didi

c++ - 如何使用 SFINAE 从 C++11 中的多个选项中选择构造函数

转载 作者:搜寻专家 更新时间:2023-10-30 23:53:45 25 4
gpt4 key购买 nike

我的问题是这个问题的延伸:How to use sfinae for selecting constructors?

在上一个问题中,提问者只是想有选择地启用单个构造函数。我想根据类模板参数类型是否可默认构造来更改构造函数的行为——我能想到的最好的方法是让两个构造函数具有相同的用法,这样就可以启用一个对于每个实例化。我的情况也不同,因为如果我不尝试使用 enable_if 有选择地启用,那么构造函数的两个版本都不会是模板函数。 (而在链接的问题中,构造函数的两个版本都在 int otherN 上进行了模板化)。

上述问题的已接受答案中的评论使我找到了 this site ,这让我创建了以下最小示例:

#include <iostream>
#include <type_traits>

namespace detail {
enum class enabler {};
enum class disabler {};
}

template <typename Condition>
using EnableIf = typename std::enable_if<Condition::value, detail::enabler>::type;

template <typename Condition>
using DisableIf = typename std::enable_if<!Condition::value, detail::disabler>::type;

template<typename T>
struct A {

T data;

// Valid if T is default-construtible; SFINAE otherwise
template<EnableIf<std::is_default_constructible<T>>...>
A() { std::cout << "Data defaulted" << std::endl; }


// Valid if T is *not* default-constructible; SFINAE otherwise
template<DisableIf<std::is_default_constructible<T>>...>
A() : data(0) { std::cout << "Data zeroed" << std::endl; }
};

// struct which is not default-constructible
struct B {
B() = delete;
B(int) {}
};

int main()
{
A<int> x; // int is default-constructible
A<B> y; // class B is not default-constructible

return 0;
}

如果我注释掉第一个构造函数和 x 的声明或第二个构造函数和 y 的声明,我可以编译它(用 -std=c++11 )。我什么都不想做,但是当我尝试编译器提示没有名为 type 的类型时在std::enable_if<false, > .

this 的答案问题采用另一种方法来解决类似的问题,但我不太了解起作用的因素,无法将这些方法组合成有效的方法。

最佳答案

不理想,但这可以完成工作:

#include <iostream>
#include <type_traits>

template<typename T>
struct A {

T data;

A() : A((std::is_default_constructible<T> *)nullptr) {}

private:
A(std::true_type *) { std::cout << "Data defaulted" << std::endl; }

A(std::false_type *) : data(0) { std::cout << "Data zeroed" << std::endl; }
};

// struct which is not default-constructible
struct B {
B() = delete;
B(int) {}
};

int main()
{
A<int> x; // int is default-constructible
A<B> y; // class B is not default-constructible

return 0;
}

关于c++ - 如何使用 SFINAE 从 C++11 中的多个选项中选择构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38537155/

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