使用std::enableif-for-template和3个通用参数
Using std::enable if for template with 3 generic arguments
我已经找到了一些关于std::enable_if
主题的线程,但不幸的是,我无法将这些示例应用到我的代码中。
template<class From, class To, class Value>
struct convert
{
static Value apply(Value value)
{
return value;
}
};
我希望只有当From
和To
相同时才激活它,所以我尝试使用
std::enable_if<std::is_same<From,To>::value>::Value
但这行不通。我该怎么做?
我还有这两个专业,让你更好地了解我的问题:
template<class From, class Value>
struct convert<From, kilometer, Value>
{
static Value apply(Value value)
{
doSomething;
}
};
template<class To, class Value>
struct convertImpl <kilometer, To, Value>
{
static Value apply(Value value)
{
doSomethingElse;
}
};
这就是我的含糊问题的根源。现在,我正在静态断言From
和To
相同的情况,从而使代码可以编译。但当这两个类型相同时,我只想返回值。
我不认为你想要SFINAE,根据你的描述,我认为你只想要一个专业化:
template<class From, class To, class Value>
struct convert
{
static Value apply(Value value)
{
Value somethingElse = ...;
return somethingElse;
}
};
template<class From, class Value>
struct convert<From,From,Value>
{
static Value apply(Value value)
{
return value; // SAME
}
};
我承认我真的看不出这有什么意义,因为Value
是一个独立于From
和To
的类型,但你可能知道一些我不知道的东西。如果你想要完整的结构专门化,这似乎是你的愿望现场观看。
祝好运
template<class From, class To, class Value>
struct convert
{
template <typename F = From, typename T = To>
static auto apply(Value value) -> typename std::enable_if<std::is_same<F,T>::value, Value>::type
{
static_assert(std::is_same<F, From>::value && std::is_same<T, To>::value, "");
// no conversion
return value;
}
template <typename F = From, typename T = To>
static auto apply(Value value) -> typename std::enable_if<!std::is_same<F,T>::value, Value>::type
{
static_assert(std::is_same<F, From>::value && std::is_same<T, To>::value, "");
// do conversion
return value;
}
};
演示
或者,这可以使用基于标签的调度来实现:
template<class From, class To, class Value>
struct convert
{
static Value apply(Value value)
{
using tag = std::integral_constant<bool, std::is_same<From, To>::value>;
return _apply(value, tag{});
}
private:
static Value _apply(Value value, std::true_type)
{
// no conversion
return value;
}
static Value _apply(Value value, std::false_type)
{
// do conversion
return value;
}
};
演示2
相关文章:
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 为什么 c++11 std::lock 和 std::scoped_lock 至少需要 2 个参数?
- 具有多个参数的模板化类专用化,其中一个模板参数是模板本身
- 在 masm x64 上打印具有多个参数
- C++ 具有 2 个模板参数的类,具有 1 个参数的函数
- 可变参数模板作为第一个参数
- 在C++中使用 std::forward 的多个参数
- 如果条件,当我想第二个参数时
- 如何在 c++ 中存储具有值的四个参数的元组
- 将多个参数传递给运算符 []
- C++ 具有GTest TYPED_TEST的多个参数
- 如何从第一个参数推断第二个参数类型?
- C++ std::enable_if - 第二个参数的功能
- std::bind 和 std::函数术语不值为接受 0 个参数?
- 推导多个参数包
- 候选构造函数(隐式复制构造函数)不可行:第一个参数需要 l 值
- 为什么模板参数推导不适用于仅指定前两个参数的可变参数模板类?
- C++如何在 switch 语句中放置两个参数
- 生成包含给定类型的 N 个参数的可变参数列表的最佳方法?