相关疑难解决方法(0)

为什么模板参数中的enable_if_t会抱怨重定义?

我有以下案例可以使用std::enable_if:

template<typename T,
         typename std::enable_if<std::is_same<int, T>::value>::type* = nullptr>
void f() { }

template<typename T,
         typename std::enable_if<std::is_same<double, T>::value>::type* = nullptr>
void f() { }
Run Code Online (Sandbox Code Playgroud)

现在,我在cppreference中看到了新的语法,在我看来更加清晰: typename = std::enable_if_t<std::is_same<int, T>::value>>

我想移植我的代码:

template<typename T,
         typename = std::enable_if_t<std::is_same<int, T>::value>>
void g() { }

template<typename T,
         typename = std::enable_if_t<std::is_same<double, T>::value>>
void g() { }
Run Code Online (Sandbox Code Playgroud)

但现在海湾合作委员会(5.2)抱怨:

error: redefinition of 'template<class T, class> void g()'
       void g() { }
Run Code Online (Sandbox Code Playgroud)

为什么会这样 ?如果可能,我该怎么做才能在这种情况下使用新的,更简洁的语法?

c++ templates sfinae enable-if c++14

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

了解有关 type_traits 的更多信息

设置

我昨天问了一个关于模板方法重载和使用类型特征解决问题的问题。我收到了一些很好的答案,他们引导我找到了解决方案。这个解决方案让我进行了更多阅读。

我登陆了 Fluent CPP 的一个页面——https ://www.fluentcpp.com/2018/05/18/make-sfinae-pretty-2-hidden-beauty-sfinae/,这个页面很有趣,然后我听了博卡拉先生引用了斯蒂芬·杜赫斯特的讲话。这一切都令人着迷。

我现在正试图多了解一点。在昨天的答案中,我得到了这个解决方案:

     template< class Function, class... Args,
              std::enable_if_t<std::is_invocable_v<Function, Args...>, std::nullptr_t> = nullptr>
     explicit MyClass( const std::string & theName, Function&& f, Args&&... args )
        : name(theName)
     {
        runner(f, args...);
     }
Run Code Online (Sandbox Code Playgroud)

替代答案

在阅读了 CPP Fluent 帖子并观看了演讲之后,我得出了最终的解决方案:

   template< class Function, class... Args>
   using IsInvocable = std::enable_if_t < std::is_invocable_v<Function, Args...> >;

    template< class Function, class... Args, typename = IsInvocable<Function, Args...> >
    explicit ThreadHandle( const std::string & name, Function && f, Args &&... args ) {
        startWithName(name, f, …
Run Code Online (Sandbox Code Playgroud)

c++ sfinae type-traits

8
推荐指数
1
解决办法
486
查看次数

C++ 17限制用于初始化模板类的fold表达式

我基本上尝试编写自己的游戏引擎用于练习和个人使用(我知道,这是一项几乎不可能完成的任务,但正如我所说,它主要用于学习新事物).

目前,我正在研究我的数学库(主要是矢量和矩阵),我遇到了一个有趣的,但主要是美学问题.

给出以下伪代码:

template <uint8 size>
struct TVector {
    float elements[size];
};
Run Code Online (Sandbox Code Playgroud)

现在我希望能够构造具有所需浮动量作为参数的结构:

TVector<3> vec0(1.0f, 2.5f, -4.0f); 
TVector<2> vec1(3.0f, -2.0f);

TVector<3> vec2(2.0f, 2.2f); // Error: arg missing 
TVector<2> vec3(1.0f, 2.0f, 3.0f) // Error: too many args
Run Code Online (Sandbox Code Playgroud)

由于数组的大小是由模板参数给出的,所以我很难为结构声明一个合适的构造函数.我的最终目标是这样的:

// This is pseudo-ideal-code
TVector(size * (float value)); // Create a constructor with number of size 
                               // parameters, which are all floats
Run Code Online (Sandbox Code Playgroud)

当然,这是非逻辑语法,但我以这种方式最接近的是用C++ 17倍表达式:

template<typename... Args>
    TVector(Args... values) {
        static_assert(sizeof...(values) <= size, "Too many args");
        uint8 i = 0;
        (... , …
Run Code Online (Sandbox Code Playgroud)

c++ constructor aggregate-initialization variadic-templates fold-expression

6
推荐指数
1
解决办法
729
查看次数