相关疑难解决方法(0)

std :: enable_if有条件地编译成员函数

我想尝试一个简单的例子来了解如何使用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)

c++ templates g++ c++11

144
推荐指数
7
解决办法
10万
查看次数

使用enable_if选择类构造函数

考虑以下代码:

#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 …

c++ templates constructor sfinae

47
推荐指数
3
解决办法
2万
查看次数

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

我的问题是这个问题的扩展: 如何使用 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)

c++ templates sfinae c++11

3
推荐指数
2
解决办法
903
查看次数

在 C++ 类中有条件地启用构造函数

我正在学习如何使用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)

c++ constructor enable-if

3
推荐指数
1
解决办法
2270
查看次数

仅用于<char>的模板化类型的附加构造函数

我有一个模板类,其中包含一个模板参数'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)

不会编译.

c++ templates

2
推荐指数
1
解决办法
154
查看次数

标签 统计

c++ ×5

templates ×4

c++11 ×2

constructor ×2

sfinae ×2

enable-if ×1

g++ ×1