我想尝试一个简单的例子来了解如何使用std::enable_if.在我读完这个答案之后,我认为想出一个简单的例子应该不会太难.我想用来std::enable_if在两个成员函数之间进行选择,并且只允许使用其中一个成员函数.
不幸的是,下面的代码不能用gcc 4.7进行编译,经过数小时和数小时的尝试后我会问你们我的错误是什么.
#include <utility>
#include <iostream>
template< class T >
class Y {
public:
template < typename = typename std::enable_if< true >::type >
T foo() {
return 10;
}
template < typename = typename std::enable_if< false >::type >
T foo() {
return 10;
}
};
int main() {
Y< double > y;
std::cout << y.foo() << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
gcc报告以下问题:
% LANG=C make CXXFLAGS="-std=c++0x" enable_if
g++ -std=c++0x enable_if.cpp -o enable_if
enable_if.cpp:12:65: error: `type' in …Run Code Online (Sandbox Code Playgroud) 考虑以下代码:
#include <iostream>
#include <type_traits>
template <typename T>
struct A {
int val = 0;
template <class = typename std::enable_if<T::value>::type>
A(int n) : val(n) {};
A(...) { }
/* ... */
};
struct YES { constexpr static bool value = true; };
struct NO { constexpr static bool value = false; };
int main() {
A<YES> y(10);
A<NO> n;
std::cout << "YES: " << y.val << std::endl
<< "NO: " << n.val << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
我想有选择地使用enable_if为某些类型定义构造函数A :: A(int).对于所有其他类型,都有默认构造函数A :: A(...),当替换失败时,它应该是编译器的默认情况.然而这对我来说有意义编译器(gcc版本4.9.0 …
我的问题是这个问题的扩展: 如何使用 sfinae 来选择构造函数?
在上一个问题中,提问者只是想有选择地启用单个构造函数。我想根据类模板参数类型是否可默认构造来更改构造函数的行为 - 我能想出的最好方法是让两个构造函数具有相同的用法,以便只启用一个对于每个实例化。我的情况也不同,因为如果我不尝试有选择地启用 with enable_if(而在链接的问题中,构造函数的两个版本都是模板化的)int otherN)。
上述问题的已接受答案中的评论将我带到了此站点,这使我创建了以下最小示例:
#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 …Run Code Online (Sandbox Code Playgroud) 我正在学习如何使用std::enable_if,到目前为止,我在有条件地启用和禁用课程中的方法方面取得了一定程度的成功。我针对布尔值对方法进行模板化,并且此类方法的返回类型是std::enable_if此类布尔值。这里的最小工作示例:
#include <array>
#include <iostream>
#include <type_traits>
struct input {};
struct output {};
template <class io> struct is_input { static constexpr bool value = false; };
template <> struct is_input<input> { static constexpr bool value = true; };
template <class float_t, class io, size_t n> class Base {
private:
std::array<float_t, n> x_{};
public:
Base() = default;
Base(std::array<float_t, n> x) : x_(std::move(x)) {}
template <class... T> Base(T... list) : x_{static_cast<float_t>(list)...} {}
// Disable the getter if it …Run Code Online (Sandbox Code Playgroud) 我有一个模板类,其中包含一个模板参数'T'.我希望类有一个构造函数,但如果T只是char,只有一个额外的构造函数"const char*"作为参数.
template <typename T>
class Container
{
public:
// Construct a container from an array of T's
Container(const T* data, int count);
// For char only construct a container from a nul terminated string
// I *only* want this constructor to be valid when T is char
Container(const T* data);
};
Run Code Online (Sandbox Code Playgroud)
有没有办法实现这一点,所以我可以这样做: -
const char* init = "Hello";
Container<char> data = init;
Run Code Online (Sandbox Code Playgroud)
会编译但是
const int init[] = {1, 3, 4};
Container<int> data = init;
Run Code Online (Sandbox Code Playgroud)
不会编译.